DAY58 单调栈01 739. 每日温度 496.下一个更大元素 I

单调栈的适用范围:

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。

739. 每日温度

暴力解法是O(n2)
DAY58 单调栈01 739. 每日温度 496.下一个更大元素 I_第1张图片这样只遍历一边就可以了。递增还是递减不用硬记,分析以下要求什么就行。
但是一定注意不要出现越界

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

496.下一个更大元素 I

跟每日温度思路是一样的,只是在比较的时候要看一下右边有比他大的这个元素有没有在num1中出现过,直接将res的大小定成nums1的大小就可以。不用完全求完nums2,得到res以后,再去匹配num1。一边求一边找就可以

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        vector<int> res(nums1.size(),-1);
        unordered_map<int,int> m;
        for(int i = 0; i < nums1.size();++i) m[nums1[i]] = i;
        stack<int> st;
        st.push(0);
        for(int i =  1; i<nums2.size();++i){
            while(!st.empty() && nums2[i] > nums2[st.top()]){
                if(m.find(nums2[st.top()]) != m.end()){
                    int index = m[nums2[st.top()]];
                    res[index] = nums2[i];
                }
                st.pop();
            }
            st.push(i);
        }
        return res;
    }
};

你可能感兴趣的:(算法,数据结构,leetcode)