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

题目描述

原题链接

在这里插入图片描述

算法

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

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

时间复杂度是 O ( n ) O(n) :遍历一次数组,空间复杂度是 O ( n ) O(n) :栈空间q[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;
    }
};

发布了239 篇原创文章 · 获赞 80 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_43827595/article/details/104211397
今日推荐