本文最后更新于:2021年2月7日 晚上
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。
示例 1:
| 输入: [1,2,1] 输出: [2,-1,2] 解释: 第一个 1 的下一个更大的数是 2; 数字 2 找不到下一个更大的数; 第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
|
注意: 输入数组的长度不会超过 10000。
Solution
参考:《算法小抄》3.7、对比 [739 每日温度](739 每日温度.md) 、 [496 下一个更大元素 I](496 下一个更大元素 I.md)
- 单调栈
- 处理循环数组:将原始数组“翻倍”,实际上没有多使用空间
| class Solution: def nextGreaterElements(self, nums: List[int]) -> List[int]: n = len(nums) ans = [-1] *n stack = [] for i in range(n*2-1, -1, -1): while stack and nums[i % n] >= nums[stack[-1]]: stack.pop() ans[i%n] = nums[stack[-1]] if stack else -1 stack.append(i%n) return ans
|
cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public: vector<int> nextGreaterElements(vector<int>& nums) { int n = nums.size(); vector<int> res(n); stack<int> stack; for (int i = 2 * n - 1; i >= 0; --i) { while (!stack.empty() && nums[i % n] >= stack.top()) { stack.pop(); } res[i % n] = stack.empty() ? -1 : stack.top(); stack.push(nums[i % n]); } return res; } };
|