分析:如题,循环数组最直接的想法就是把数组*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;
}
};