496. 下一个更大元素 I
思路1:栈+字典存储(正向遍历)
先对 nums2 中的每一个元素,求出其下一个更大的元素。并将这些答案放入哈希表中,再遍历数组 nums1,直接找出对应的答案。
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
stack = []
hash_table = {}
for num in nums2:
while stack and num>stack[-1]: # 寻找当前元素可以作为前面哪个元素的更大元素
hash_table[stack.pop()] = num
stack.append(num)
return [hash_table.get(num,-1) for num in nums1]
思路2:反向遍历
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
stack = []
hash_table = {}
for num in nums2[::-1]:
while stack and num>=stack[-1]: # 栈中比当前元素小的全部弹出
stack.pop()
hash_table[num]= stack[-1] if stack else -1 # 栈不空时存着比当前元素更大的元素
stack.append(num)
return [hash_table.get(num,-1) for num in nums1]
739. 每日温度-实际是求下一个更大元素和现在索引的差值
区别在于栈里面存放索引差值
class Solution:
def dailyTemperatures(self, T: List[int]) -> List[int]:
n = len(T)
ans = [0]*n
stack = []
for i in range(n-1,-1,-1):
while stack and T[i]>=T[stack[-1]]:
stack.pop(-1)
if stack: ans[i] = stack[-1]-i
stack.append(i)
return ans
503. 下一个更大元素 II
思路1:直接把原数组翻倍,输出时只要前半部分答案。
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
nums.extend(nums) # 输入翻倍
n = len(nums)
ans = [-1]*n
stack = []
for i in range(n-1,-1,-1):
while stack and nums[i]>=stack[-1]:
stack.pop(-1)
if stack: ans[i] = stack[-1]
stack.append(nums[i])
return ans[:n//2] # 输出前部分
优化:通过虚拟的输入翻倍来减少空间,主要是对索引进行求余,相当于在同样的数据上运行了两遍。
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
n = len(nums)
ans = [-1]*n
stack = []
for index in range(2*n-1,-1,-1): # 改动
i = index%n # 改动 实现循环,相当于在同样的数据上运行了两遍
while stack and nums[i]>=stack[-1]:
stack.pop(-1)
if stack: ans[i] = stack[-1]
stack.append(nums[i])
return ans
556. 下一个更大元素 III
参考:31. 下一个排列