LeetCode 503. 下一个更大元素II(单调栈)

题目描述

原题链接

LeetCode 503. 下一个更大元素II(单调栈)_第1张图片

算法

(单调栈) O ( n ) O(n) O(n)

  • 从后往前,维护一个单调严格递减的栈,如果nums[i]大于等于栈顶元素,则不断出栈,直到不满足要求
  • 然后让nums[i]等于栈顶元素(表示下一个比它更大的数),如果栈为空,就让nums[i] = -1
  • 因为是循环数组,所以我们要copy一份nums

时间复杂度是 O ( n ) O(n) O(n):遍历一次数组,空间复杂度是 O ( n ) O(n) O(n):栈空间q[N]需要 O ( n ) O(n) O(n)

代码

class Solution {
public:
    static const int N = 1e4 + 7;
    int q[N];
    int hh = 0, tt = 0;
    vector<int> nextGreaterElements(vector<int>& nums) {
        int n = nums.size();
        // Because circulation, we need double nums
        nums.insert(nums.end(), nums.begin(), nums.end());
        // Monotonous stack
        for (int i = 2 * n - 1; i >= 0; i --) {
            while(hh < tt && nums[i] >= q[tt - 1]) tt --;
            int tmp = nums[i];
            if (hh < tt) nums[i] = q[tt - 1]; // next great element
            else nums[i] = -1; // not exist

            q[tt ++] = tmp; 
        }
        
        nums.erase(nums.begin() + n, nums.end());
        return nums;
    }
};

你可能感兴趣的:(LeetCode)