单调栈 适合解决:
求当前元素左边或者右边第一个比当前元素大或者小的元素
单调栈:保证栈中的元素递增或者递减
单调栈中元素的作用:存放遍历过的元素
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
from collections import deque
st = []
result = [0] * len(temperatures)
for i in range(len(temperatures)):
if i == 0 or temperatures[i] <= temperatures[st[-1]]:
st.append(i)
else:
while len(st) > 0 and temperatures[i] > temperatures[st[-1]]:
top = st.pop()
result[top] = i - top
st.append(i)
return result
碰到比栈顶元素大的就pop,把栈顶元素所在的索引赋值为当前元素的索引减栈顶的索引;碰到小的就压栈,直到碰到大的。很巧妙
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
result = [-1]*len(nums1)
st = [0]
for i in range(1,len(nums2)):
if nums2[i]<=nums2[stack[-1]]:
st.append(i)
else:
while len(stack) > 0 and nums2[i] > nums2[stack[-1]]:
if nums2[st[-1]] in nums1:
index = nums1.index(nums2[stack[-1]])
result[index]=nums2[i]
st.pop()
st.append(i)
return result
和上一题类似,只不过多了一个映射