labuladong way
不严格单调递增栈
1 | vector<int> nextGreaterElements(vector<int>& nums) |
Why?
- 为什么这里是用 不严格的单调递增栈 而不是 严格的单调递增栈
- 为什么通过索引翻倍-1后,是选择方向遍历元素的,而不是正向遍历?
总结
通过索引翻倍-1 和 %运算,来达到模拟数组中元素翻倍的效果。
1
2
3
4
5
6
7
8// 假装这个数组长度翻倍了
for (int i = 2 * n - 1; i >= 0; i--)
{
while (!s.empty() && s.top() <= nums[i % n])
s.pop();
res[i % n] = s.empty() ? -1 : s.top();
s.push(nums[i % n]);
}同时,在元素出栈后,对栈空状态进行判断,
- 若空了则,
res
对应值为-1
- 若不空则,
res
对应值为n
- 省去了一个存放
tuple
的容器的空间大小
- 若空了则,
Reference
https://leetcode-cn.com/problems/next-greater-element-ii/solution/dan-diao-zhan-jie-jue-next-greater-number-yi-lei-2/