题目链接
英文链接:https://leetcode.com/problems/next-greater-element-ii/
中文链接:https://leetcode-cn.com/problems/next-greater-element-ii/
题目详述
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。
示例 1:
1 | 输入: [1,2,1] |
注意: 输入数组的长度不会超过 10000。
题目详解
- 与 LeetCode496-下一个更大元素I 类似,区别在于将线性数组升级为了循环数组。解答思路是一致的,仍旧是运用单调栈。
- 将原数组拼接一份放在数组后面得到一个新的数组。可以进行物理拼接,即创建一个新的数组,也可以进行逻辑拼接,超过原数组的长度的下标进行转换。这样就把循环数组的问题转化为了线性数组的问题。
- 创建一个结果数组,所有元素赋值为 -1.
- 遍历逻辑数组,运用单调栈进行结算。
1 | public class LeetCode_00503 { |
- 可以进行对上面的代码进行一些小优化。
- 优化一:当 i 小于 n 时,才 push 进栈;否则不用入栈。
- 优化二:栈中剩余的索引就是那些不存在下一个更大元素的元素的索引,可以逐个 pop 并赋值对应位置为 -1,这样结果数组中元素可以不用事先实现初始化为 -1。
1 | public class LeetCode_00503 { |