Day58 单调栈 LC 739 496

62 阅读1分钟

739. 每日温度

心得

  • 单调栈尤其适用于一维数组求左边、右边第一个比其大或小的元素类题目

题解

  • 通过空间换时间,遍历到当前不知道前面元素大小,所以用栈来保存遍历过的元素的索引,从栈顶到底递增排序,保证出栈的元素一定是大于的第一个元素
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;
    }
};

// 可精简
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++) {
            while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
                result[st.top()] = i - st.top();
                st.pop();
            }
            st.push(i);
        }
        return result;
    }
};

496. 下一个更大元素 I

心得

题解

  • 相比上体,绕了点,栈还是存索引,同样递增栈,其实递减栈求得是右边第一个小的
  • 还是所有元素入栈,大于的时候相关元素出栈处理,不相关直接出栈,即只要大于就要处理,保持递增
class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        vector<int> result(nums1.size(), -1);
        stack<int> st; // 存索引
        if (nums1.size() == 0) return result;
        st.push(0);
        unordered_map<int, int> umap;
        for (int i = 0; i < nums1.size(); i++) {
            umap[nums1[i]] = i;
        }
        for (int i = 1; i < nums2.size(); i++) {
            while (!st.empty() && nums2[i] > nums2[st.top()]) {
                if (umap.count(nums2[st.top()]) > 0) {
                    int index = umap[nums2[st.top()]];
                    result[index] = nums2[i];
                }
                st.pop();
            }
            st.push(i);
        }
        return result;
    }
};