算法训练1-day40-单调栈

26 阅读1分钟
  1. 739. 每日温度

要求找下一个更高温度出现在几天后,因此栈内记录的是单调递减的序列

对于剩余元素的处理,因为如果气温在这之后都不会升高,请在该位置用 0 来代替。所以在初始化时初始为0就可以避免后续再处理剩余元素

AC代码:

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

        return res;
    }
};
  1. 496. 下一个更大元素 I

先将nums1转成map,方便获取元素对应的索引 容纳后对nums2使用单调栈 注意nums1是nums2的子集,意味着nums2中有些元素nums1中没有,赋值时要注意这一点

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        int n = nums2.size();
        int m = nums1.size();
        map<int, int> nums1_map;
        for (int j = 0; j < m; ++j) {
            nums1_map.emplace(nums1[j], j);
        }
        vector<int> res(m, -1);

        stack<int> s;
        for (int i = 0; i < n; ++i) {
            while (!s.empty() && nums2[i] > s.top()) {
                if (nums1_map.find(s.top()) != nums1_map.end()) {
                    res[nums1_map[s.top()]] = nums2[i];
                }
                s.pop();
            }
            s.push(nums2[i]);
        }

        return res;
    }
};
  1. 503. 下一个更大元素 II

题目给定的是循环数组,那么在第一次遍历后处理剩余元素时就有些不同,又因为要找每个元素的 下一个更大元素,所以我们最后再从头遍历一遍,不过这次不用再往栈中添加元素,因为循环数组相当于在数组最后再拼接了一个原数组,分成两段做即可

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        int n = nums.size();

        vector<int> res(n, -1);
        stack<int> s;
        for (int i = 0; i < n; ++i) {
            while (!s.empty() && nums[i] > nums[s.top()]) {
                res[s.top()] = nums[i];
                s.pop();
            }
            s.push(i);
        }
        for (int i = 0; i < n; ++i) {
            while (!s.empty() && nums[i] > nums[s.top()]) {
                res[s.top()] = nums[i];
                s.pop();
            }
        }

        return res;
    }
};