Leecode 0503. 下一个更大元素 II
503. 下一个更大元素 II
给定一个循环数组 nums
( nums[nums.length - 1]
的下一个元素是 nums[0]
),返回 nums
中每个元素的 下一个更大元素 。
数字 x
的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1
。
示例 1:
1 | 输入: nums = [1,2,1] |
示例 2:
1 | 输入: nums = [1,2,3,4,3] |
解题思路
核心思路是单调栈 + 数组翻倍模拟循环,通过将数组复制一份拼接在末尾(模拟循环),利用单调栈高效找到每个元素的下一个更大元素:
- 模拟循环数组:
- 将原数组
nums
复制一份并拼接在末尾(如[1,2,1]
变为[1,2,1,1,2,1]
),这样无需额外处理循环边界,可直接线性遍历。
- 将原数组
- 单调栈求解:
- 使用单调栈存储元素索引,栈内元素对应的数值保持递减顺序;
- 遍历拼接后的数组,对于每个元素
nums[i % n]
(n
为原数组长度):- 当栈不为空且栈顶元素对应的数值小于当前元素时,当前元素是栈顶元素的下一个更大元素,记录结果并弹出栈顶;
- 将当前索引
i
压入栈(仅处理原数组范围内的索引,避免重复计算)。
代码实现
1 | class Solution { |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.