Leetcode 503 Next Greater Element II

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

示例 1:
输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
注意: 输入数组的长度不会超过 10000。

分析:

  1. 如果你还没解决next Greater Element I,那么建议你先看一下I的解法,具体思路见Leetcode-496-Next-Greater-Element-I,看完之后本题解法呼之欲出
  2. 我们只需要对给定的nums数组*2即可,如示例1中nums,我们将其改成[1,2,1, 1,2,1],用I中思想解即可
  3. 对于数组中最大的数,全设为-1即可

思路:

  1. 初始化res数组,全为-1,len(res) = len(nums)
  2. 利用栈存储数据和其下标,因为我们将nums长度翻倍了,故需判断一下下标是否小于len(res)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution(object):
def nextGreaterElements(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
if not nums: return []
res = [-1] * len(nums)

nums += nums
stack = [(nums[0],0)]
for i in range(len(nums)):
while stack and nums[i] > stack[-1][0]:
val,index = stack.pop()
if index < len(res):
res[index] = nums[i]
stack.append((nums[i],i))

return res

224 / 224 test cases passed.
diffculty: medium
Runtime: 548 ms