单调栈01

单调栈

739.每日温度

这里用下标进栈,解决日期问题。

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

496.下一个更大元素 I

暴力法:

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        int n1 = nums1.size();
        int n2 = nums2.size();
        vector<int> answer(n1, 0);
        for(int i = 0; i < n1; i++)
        {
            int j = 0;
            while(j < n2 && nums2[j] != nums1[i])
            {
                j++;
            }
            while(j < n2 && nums2[j] <= nums1[i])
            {
                j++;
            }
            if(j == n2)
                answer[i] = -1;
            else
                answer[i] = nums2[j];
        }
        return answer;
    }
};

单调栈:

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;
    }
};

503.下一个更大元素II

与739相同

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        int n = nums.size();
        vector<int> answer(n, -1);
        stack<int> st;
        st.push(0);
        for(int i = 1; i < 2 * n - 1 ; i++)
        {
            cout << i << " ";
            while(!st.empty() && nums[st.top()] < nums[i % n])
            {
                int j = st.top();
                answer[j]  = nums[i % n];
                st.pop();
            }
            st.push(i % n);
        }
        return answer;
    }
};
posted @ 2025-06-30 15:52  skyler886  阅读(8)  评论(0)    收藏  举报