C++单调栈及其应用(2)--解决循环数组问题

在这里插入图片描述
分析:如题,循环数组最直接的想法就是把数组*2去遍历即可,注意返回位置的值需要控制在0—n-1,那么就需要我们使用i%n。可以遍历一次数组,如果元素是单调递减的(则他们的「下一个更大元素」相同),我们就把这些元素保存,直到找到一个较大的元素;把该较大元素逐一跟保存了的元素比较,如果该元素更大,那么它就是前面元素的「下一个更大元素」,单调栈的作用是什么?就是确保了如果栈内(数组前的都是大元素)后续就不能去改变它代表后面没有更大的元素,同时如果遇到比站内大的元素,就会一个一个弹出,把大元素放到相应位置即把得出来下一个更大的元素,弹出以后就不再负责,说明就只是比原来大的,而不是最大的。
具体思路:建立一个单调栈,先把第一个数放进去,如果发现了后面有比第一个数大的,就把位置入栈,同时在数组里这个位置上填了相应的数,如果遇不到就一直为-1,如果栈为空,则把当前元素放入栈内;

如果栈不为空,则需要判断当前元素和栈顶元素的大小:
如果当前元素比栈顶元素大:说明当前元素是前面一些元素的「下一个更大元素」,则逐个弹出栈顶元素,直到当前元素比栈顶元素小为止。
如果当前元素比栈顶元素小:说明当前元素的「下一个更大元素」与栈顶元素相同,则把当前元素入栈。
动图演示:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值