739.每日温度
思路:
1.首先,将答案数组 ans
全部赋值为 0。然后遍历数组每个位置元素。
2.如果栈为空,则将当前元素的下标入栈。
3.如果栈不为空,且当前数字大于栈顶元素对应数字,则栈顶元素出栈,并计算下标差。
4.此时当前元素就是栈顶元素的下一个更高值,将其下标差存入答案数组 ans
中保存起来,判断栈顶元素。
5.直到当前数字小于或等于栈顶元素,则停止出栈,将当前元素下标入栈。
6.最后输出答案数组 ans
。
class Solution:def dailyTemperatures(self, T: List[int]) -> List[int]:n = len(T)stack = []ans = [0 for _ in range(n)]for i in range(n):while stack and T[i] > T[stack[-1]]:index = stack.pop()ans[index] = (i-index)stack.append(i)return ans
496.下一个更大元素 I
思路:
1.情况一:当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
此时满足递增栈(栈头到栈底的顺序),所以直接入栈。
2.情况二:当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
如果相等的话,依然直接入栈,因为我们要求的是右边第一个比自己大的元素,而不是大于等于!
3.情况三:当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况
此时如果入栈就不满足递增栈了,这也是找到右边第一个比自己大的元素的时候。
判断栈顶元素是否在nums1里出现过,(注意栈里的元素是nums2的元素),如果出现过,开始记录结果。
记录结果这块逻辑有一点小绕,要清楚,此时栈顶元素在nums2数组中右面第一个大的元素是nums2[i](即当前遍历元素)。
class Solution:def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:result = [-1]*len(nums1)stack = [0]for i in range(1,len(nums2)):# 情况一情况二if nums2[i]<=nums2[stack[-1]]:stack.append(i)# 情况三else:while len(stack)!=0 and nums2[i]>nums2[stack[-1]]:if nums2[stack[-1]] in nums1:index = nums1.index(nums2[stack[-1]])result[index]=nums2[i]stack.pop() stack.append(i)return result