503. 下一个更大元素 II(中等)
方法:单调栈
- 「 对于找最近一个比当前值大/小」的问题,都可以使用单调栈来解决。
- 栈可以很好的保存原始位置,最近影射栈顶。题目要求更大,因此更大即解–出栈,更小则入栈。
- 「 栈内存放的永远是还没更新答案的下标。⌟
思路
-
首先,创建一个大小为n的答案数组ans,初始化为-1。
-
然后,使用一个栈s来存储数组中的索引。 从数组的第一个元素开始遍历,将第一个元素的索引压入栈中。
-
接着遍历数组的剩余元素。对于每个元素,我们将栈顶元素与当前元素进行比较。 如果栈顶元素小于当前元素,则说明栈顶元素的下一个更大元素就是当前元素。 我们将栈顶元素的下一个更大元素设置为当前元素,并将栈顶元素出栈。 重复这个过程,直到栈为空或者栈顶元素不小于当前元素。
-
最后,将当前元素的索引压入栈中,以便在后面的元素中找到它的下一个更大元素。 当遍历完整个数组后,我们就得到了所有元素的下一个更大元素。
-
两次遍历:由于目标要么在当前元素之前,要么在之后,因此两次遍历一定能覆盖到。
代码
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
vector<int> ans(n, -1);
// vector<int> flag(n, 0);
stack<int> s;
s.push(0);
for(int i=1;i <= 2*n-2;++i){
while(!s.empty() && (nums[s.top()] < nums[i%n])){
ans[s.top()] = nums[i%n];
s.pop();
}
s.push(i%n);
}
return ans;
}
};