更加形象的单调栈|刷题打卡

235 阅读2分钟

一、题目描述:

二、思路分析:

这次相较于上次说的车子,更像是一道单调栈的题,先抛开循环数组的问题,我们很容易感受到单调的需要在里面,我们要求的是下一个比当前元素大的元素

也就是说,下一个比当前元素大的元素前面的任何比当前元素小的元素都是不需要关注的

那么,有没有可能元素ABCD,D > A > C > B

那么如果我们在A的时候,忽略了 BC,是否会得到错误答案

如果单调栈是递增的,就相当于先遍历一遍构建栈,再计算

这种肯定就是会得到错误答案

但如果单调栈是递减的呢,那么求下一个比当前元素大的元素这个的方式就是用栈顶的元素和数组元素比较,这样栈中就是

A
A B
A C(因为B小于C,所以B出栈)
D(因为C小于D,所以C出栈,因此A小于D,所以A出栈)

三、AC 代码:

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        int n = nums.size();
        vector<int> ret(n, -1);
        stack<int> stk;
        for (int i = 0; i < n * 2 - 1; i++) {
            while (!stk.empty() && nums[stk.top()] < nums[i % n]) {
                ret[stk.top()] = nums[i % n];
                stk.pop();
            }
            stk.push(i % n);
        }
        return ret;
    }
};


四、总结:

在单调栈这个知识点我掌握的还是很差,但是有时侯如果能确定问题是单调栈可以解决,不妨预先假设结果,再反向验证,比如先确定单调递增,再看看能不能做出来,如果做不出来,自然也就是单调递减了。

这种投机取巧的方式当然不鼓励向我学习,但难免面试时会用到,平时肯定还是以知识点巩固为主。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情