Leetcode - 739
这种什么找下一个更大,更小的,就可以用单调栈了,单调栈在使用的过程中,要注意,从栈顶到栈底的元素的顺序,比如这题,要找下一个最近的比自己大的元素,那么只能是递增。
思想是:创建一个栈,遍历序列,若当前的值小于等于栈顶元素就入栈,若大于栈顶元素,那么就出栈,此时栈中都存储的是元素的下标,出栈代表已经遇到了下一个更大元素了,此时我们用这个元素的下标直接对应结果数组的下标,用当前元素的下标减去出栈元素的下标就是代表过了几步才遇到,将这个差值赋值给结果数组。 注意出栈的这个过程是一个循环,因为有可能当前这个元素还大于栈中其他元素。直到没有满足条件的,将这个元素入栈。若对序列遍历结束后,栈不为空,此时栈中的元素代表这些元素是找不到下一个更大元素了。
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
stack = []
res = [0] * len(temperatures)
for i, v in enumerate(temperatures):
if stack:
while stack and stack[-1][1] < v:
out = stack.pop()
res[out[0]] = i - out[0]
stack.append([i,v])
else:
stack.append([i, v])
return res
Leetcode - 496
这题需要一个巧妙的想法去做,这里的做法是直接对Nums2遍历,使用单调栈,当遇到元素大于栈顶元素时,我们先判断这个栈顶元素是不是在nums1中,若在,则找出在nums1中的下标,然后利用这个下标到结果数组中赋值为当前元素的值即可。
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
res = [-1] * len(nums1)
stack = []
for i,v in enumerate(nums2):
if stack:
while stack and stack[-1][1] < v:
out = stack.pop()
if out[1] in nums1:
res[nums1.index(out[1])] = v
stack.append([i,v])
else:
stack.append([i,v])
return res
但是这种方法效率并不高,直接暴力解法,效果更快,遍历nums1,找出当前元素在Nums2中的位置,然后从这个位置开始遍历Nums2,找到更大值就赋值给结果数组
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
res = [-1] * len(nums1)
for index, i in enumerate(nums1):
start = nums2.index(i)
for j in range(start + 1, len(nums2)):
if nums2[j] > i:
res[index] = nums2[j]
break
return res