739. 每日温度
https://leetcode.com/problems/daily-temperatures/
思路:本题是单调栈的一个经典应用, 单调栈是循环数组时, 不停的把元素推入栈中, 同时如果需要, 推出栈中的元素, 保持栈的单调性。 单调栈可以是递增或者递减的。递增栈中, 栈顶的元素是最小的 (先入后出) 例如数组 [5, 3,4,1] 单调递增栈中的元素 i = 0, st = [5], i=1 st=[5, 3], i = 2 st = [5, 4] (推出3)。 i = 3 st = [5, 4, 1]. 可以看到当我们为了加入一个元素而不得不推出一个元素时, 被推出的元素右边第一个大于它的元素就是将要被推入的元素。 而被推入栈之前, 栈顶的元素是左边第一个大于它的元素。 同理可用单调递减栈处理寻找左右小于当前元素的值的问题。
难点: 掌握单调栈的原理
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
ans = [0] * len(temperatures)
st = deque()
for i in range(len(temperatures)):
while st and temperatures[st[-1]] < temperatures[i]:
j = st.pop()
ans[j] = i - j
st.append(i)
return ans
496.下一个更大元素 I
https://leetcode.com/problems/next-greater-element-i/description/
思路: 这个题想要做到O(nums1.length + nums2.length) 并不是一个简单的问题。要结合哈希表和 单调栈。 哈希表记录元素值 和元素在nums 1 的下标, 这样我们在用单调递增栈时, 当碰到元素在 hash table 中的时候, 找到了它右边最近的更大元素, 就可以在对应答案的下标中修改。
难点:结合
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
ans = [-1] * len(nums1)
_tmp = {num: i for i, num in enumerate(nums1)}
st = deque()
for j in range(len(nums2)):
while st and st[-1] < nums2[j]:
num = st.pop()
if num in _tmp:
ans[_tmp[num]] = nums2[j]
st.append(nums2[j])
return ans