代码随想录算法训练营第五十八天|739.每日温度496.下一个更大元素Ⅰ

Posted Geed20020912

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码随想录算法训练营第五十八天|739.每日温度496.下一个更大元素Ⅰ相关的知识,希望对你有一定的参考价值。

day58 2023/03/30

一、每日温度

请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

分析如下:

要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了

单调栈的本质是空间换时间

在使用单调栈的时候首先要明确如下几点:

1.单调栈里存放的元素是什么?

单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。

2.单调栈里元素是递增呢? 还是递减呢?

注意以下讲解中,顺序的描述为 从栈头到栈底的顺序

使用单调栈主要有三个判断条件。

  • 当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
  • 当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
  • 当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况

具体分析见代码随想录,分析的好透彻,好强 

代码如下:

class Solution 
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) 
     stack<int> st;
     vector<int> result(temperatures.size(),0);
     st.push(0);
     for(int i=1;i<temperatures.size();i++)
     
         if(temperatures[i]<temperatures[st.top()])
           st.push(i);
         else if(temperatures[i]==temperatures[st.top()])
           st.push(i);
        else
        
            while(!st.empty()&&temperatures[i]>temperatures[st.top()])
            
               result[st.top()]=i-st.top();
               st.pop();
            
            st.push(i);
        
     
     return result;
    
;

二、下一个更大元素Ⅰ

给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。

请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。

分析如下:

整体逻辑与上题相同,只是本题使用了一个map

代码如下:

class Solution 
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) 
        stack<int> st;
        vector<int> result(nums1.size(), -1);
        if (nums1.size() == 0) return result;

        unordered_map<int, int> umap; // key:下标元素,value:下标
        for (int i = 0; i < nums1.size(); i++) 
            umap[nums1[i]] = i;
        
        st.push(0);
        for (int i = 1; i < nums2.size(); i++) 
            if (nums2[i] < nums2[st.top()])            // 情况一
                st.push(i);
             else if (nums2[i] == nums2[st.top()])    // 情况二
                st.push(i);
             else                                     // 情况三
                while (!st.empty() && nums2[i] > nums2[st.top()]) 
                    if (umap.count(nums2[st.top()]) > 0)  // 看map里是否存在这个元素
                        int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下标
                        result[index] = nums2[i];
                    
                    st.pop();
                
                st.push(i);
            
        
        return result;
    
;

爱创课堂每日一题第五十八天-javascript对象的几种创建方式

1,工厂模式

2,构造函数模式

3,原型模式

4,混合构造函数和原型模式

5,动态原型模式

6,寄生构造函数模式

7,稳妥构造函数模式


以上是关于代码随想录算法训练营第五十八天|739.每日温度496.下一个更大元素Ⅰ的主要内容,如果未能解决你的问题,请参考以下文章

代码随想录算法训练营第三十八天 | 509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯

代码随想录算法训练营第三十八天 | 理论基础 ,509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯

代码随想录算法训练营第四十八天 | 198.打家劫舍 213.打家劫舍II337.打家劫舍III

代码随想录算法训练营第五十二天 | 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

代码随想录算法训练营第五十六天 | 583. 两个字符串的删除操作72. 编辑距离编辑距离总结

孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库