503. 下一个更大元素 II

  • 题目
  • 算法设计:单调栈



 


题目

503. 下一个更大元素 II_单调栈


 


算法设计:单调栈

前置知识:单调栈原理,请猛击:496. 下一个更大元素 I

和 496. 下一个更大元素 I 这题相同,唯一变化是数组变成了循环数组。

比如输入 [1, 2, 1],循环数组应该返回 [2, -1, 2],而不是 [2, -1, -1],因为拥有了环形属性,最后一个元素 1 绕了一圈后找到了比自己大的元素 2。

503. 下一个更大元素 II_单调栈_02

对于这种需求,思路是将数组长度翻倍:

  • 原数组:2, 3, 1
  • 拉直数组:2, 3, 1, 2, 3, 1

这样原数组的末尾 1,就可以找到右边第一个更大的元素 2。

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        stack<int> s;
        vector<int> res(nums.size());
        for (int i = nums.size() - 1; i >= 0; i--) // 预先存下数组,实现数组翻倍
            s.push(nums[i]);    
        for (int i = nums.size() - 1; i >= 0; i--) {
            while (!s.empty() && s.top() <= nums[i])
                s.pop();
            res[i] = s.empty()? -1: s.top();
            s.push(nums[i]);
        }
        return res;
    }
};