代码随想录算法训练营第五十八天 | 739. 每日温度、

739. 每日温度

视频讲解

主要思路:

(1)单调栈中放的是元素下标而不是元素值

(2)根据题意单调栈中维护的是从栈顶到栈底单调增加

(3)如果当前加入的元素小于等于单调栈顶元素,则将其下标加入栈;如果比栈顶元素大,就用在循环中将当前元素与栈顶元素作差得到距离并不断弹出栈顶元素直到栈顶大于当前元素

易错点:

不要忘了单调栈里存放的是下标

代码实现:

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

496. 下一个更大元素 I

视频讲解

主要思路:

这题相对于上一题其实绕了点,首先num1是nums2的子集,要在nums2中找到第一个比当前nums1元素大的元素,可以这么思考:就按上一题遍历nums2,维护单调栈,区别在于当需要往result里写返回值的时候要先判断栈顶元素在不在nums1里面,而要想知道在不在就需要用一个unordered_map,它的键用来记录nums1里面的值,值用来记录nums1的值的下标

易错点:

代码实现:

class Solution {
public:
    vector nextGreaterElement(vector& nums1, vector& nums2) {
        stack st;  //栈里存放的是下标
        vector result(nums1.size(), -1);
        if (nums1.size() == 0) return result;

        unordered_map 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()]) {                                  
                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;
    }
};

你可能感兴趣的:(算法训练营,leetcode,算法)