LeetCode 739. 每日温度
题目链接:739. 每日温度 - 力扣(LeetCode)
单调栈开始,为什么要用栈,因为栈是先入后出,当我们遍历从前往后的时候,每次遍历的元素都是添加至栈尾,方便我们进行比较,满足条件计算下标差值(因为是求几天后比今天热),不满足就继续走。
代码:
#python //数组中每一位表示之后比今天温度高的天数距离
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
res = [0 for _ in range(len(temperatures))] //每个的长度
stack = [] //初始化一个空栈
for i in range(len(temperatures)):
while len(stack) > 0 and temperatures[i] > temperatures[stack[-1]]: #如果大,就继续,如果小,啥都不操作,继续stack.append
res[stack[-1]] = i - stack[-1] #stack[-1]是满足条件的下标,i - stack[-1]是距离
stack.pop() #用完了丢掉
stack.append(i) #第一步,要把当前的下标放入栈中
return res
LeetCode 496.下一个更大元素 I
题目链接:496. 下一个更大元素 I - 力扣(LeetCode)
先看是示例,题目意思是nums1中每个元素存在与nums2,对nums1中每个元素在nums2中对应位置之后进行判别,找到更大的元素,同样和上一题一样涉及到了位置距离的判别,因此同样使用单调栈。
代码:
#python
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
stack = []
nums2_next_greater = {} # 用于存储nums2中每个元素的下一个更大的元素
# 首先,找出nums2中每个元素的下一个更大的元素
for num in nums2:
while stack and num > stack[-1]:
nums2_next_greater[stack.pop()] = num
stack.append(num)
# 处理栈中剩余的元素,它们没有下一个更大的元素
while stack:
nums2_next_greater[stack.pop()] = -1
# 对于nums1中的每个元素,查找其在nums2中的下一个更大的元素
res = [nums2_next_greater.get(num, -1) for num in nums1]
return res