avatar

LeetCode-503 下一个更大元素II

📝题目

1
2
3
4
5
6
7
8
9
10
11
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。

示例 1:

输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

限制: 输入数组的长度不会超过 10000。


📝思路

单调栈!!!
遍历一次数组,如果元素是单调递减的(则他们的「下一个更大元素」相同),我们就把这些元素保存,直到找到一个较大的元素;把该较大元素逐一跟保存了的元素比较,如果该元素更大,那么它就是前面元素的「下一个更大元素」。

如何实现循环数组???

  • 一种实现方式是,把数组复制一份到数组末尾;
  • 另一种常见的实现方式是,使用取模运算可以把下标 i 映射到数组 nums 长度的 0 - N 内。

📝题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vector<int> nextGreaterElements(vector<int>& nums) {
int len = nums.size();
if (!len) return {};

stack<int> s;
vector<int> res(len, -1);
for (int i = 0; i < len*2; ++i) {
while (!s.empty() && nums[i%len] > nums[s.top()]) {
res[s.top()] = nums[i%len];
s.pop();
}
s.push(i%len);
}
return res;
}
Author:WhiteBeerHouse
Link:https://github.com/WhiteBeerHouse/WhiteBeerHouse.github.io/tree/master/2021/03/06/LeetCode-503-%E4%B8%8B%E4%B8%80%E4%B8%AA%E6%9B%B4%E5%A4%A7%E5%85%83%E7%B4%A0II/
Copyright Notice:All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.