- 下一个更大元素 II
给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。
数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。
示例 1:
输入: nums = [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
示例 2:
输入: nums = [1,2,3,4,3]
输出: [2,3,4,-1,4]
比较中规的方法:
def nextGreaterElements(nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
a=[]
for i in range(len(nums)):
print("====i:",i)
flag=0
for j in range(i+1,len(nums)):
print("nums[i]:",nums[i])
print("nums[j]:",nums[j])
if nums[j]>nums[i]:
a.append(nums[j])
flag=1
break
if flag==0:
for k in range(0,i):
if nums[k] > nums[i]:
a.append(nums[k])
flag = 1
break
if flag==0:
a.append(-1)
print("a:",a)
return a
方法二:单调栈
def nextGreaterElements(nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
N = len(nums)
res = [-1] * N#存放了最终的结果
stack = []#栈 存放的是nums中数的下标
for i in range(N * 2):#N=7则这里i % N 会取0、1、2、3、4、5、6、0、1、2、3、4、5、6
print("stack:",stack)
print("nums[i % N]:", nums[i % N])#nums中的每一个数的下标
#print("stack[-1]:", stack[-1])#栈的最后一个数,数是nums中数的下标
while stack and nums[stack[-1]] < nums[i % N]:#如果stack不是空列表 and 当前的nums中的数>栈中最后一个数
res[stack.pop()] = nums[i % N] #同时当前nums中的大数 赋值给 res即被pop出来的数字对应的res中的位置=给当前nums中的数
#则把栈中最后一个数pop出来 while循环的意思是 只要比当前nums中的数 小的,都得出栈
stack.append(i % N)#否则即当前的nums中的数<栈中最后一个数,则把数入栈
return res
nums=[11,9,10,2]
a=nextGreaterElements(nums)
print(a)#[-1, 10, 11, 11]