1、每日温度
class Solution:
# 单调栈适合:找到左/右边 第一个比当前元素 大/小的元素
# 递增/减单调栈 求第一个比当前大/小的位置
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
stack = [0]
result = [0]*len(temperatures)
for i in range(1,len(temperatures)):
# 依次把当前元素和栈顶元素比较
cur = stack[-1]
# 如果当前元素比栈顶元素小,入栈
if temperatures[i] <= temperatures[cur]:
stack.append(i)
# 如果当前元素大于栈顶元素
else:
# 将栈顶元素一直pop,直到没有比当前元素小的
while len(stack) != 0 and temperatures[stack[-1]] < temperatures[i]:
# 每次pop的时候计算下表差值,计入result
cur = stack.pop()
result[cur] = i-cur
# 没有比当前元素小的了,当前元素入栈
stack.append(i)
return result
2、下一个更大元素
# class Solution: # 暴力
# def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
# result = [-1]*len(nums1)
# for i in range(len(nums1)):
# for j in range(nums2.index(nums1[i]), len(nums2)):
# if nums2[j] > nums1[i]:
# result[i] = nums2[j]
# break
# return result
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
next_greater = {}
stack = []
# 现在nums2里面查找每个元素的下一最大元素
# 遍历 nums2 找出下一个更大元素
for num in nums2:
while stack and stack[-1] < num:
next_greater[stack.pop()] = num
stack.append(num)
# 根据 nums1 里面的每个元素查找
result = [-1] * len(nums1)
for i in range(len(nums1)):
if nums1[i] in next_greater:
result[i] = next_greater[nums1[i]]
return result
3、下一个最大元素II
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
n = len(nums)
result = [-1]*n
nums_2 = nums + nums
stack = []
for i in range(2*n):
idx = i % n
while stack and nums_2[stack[-1]] < nums_2[i]:
result[stack.pop()] = nums_2[i]
if idx < n:
stack.append(idx)
return result