739. 每日温度
题目链接:https://leetcode.com/problems/daily-temperatures
解法:
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。
单调栈里只需要存放元素的下标i,通过下标可以取对应的元素。
这里是单调栈是递增的,栈为一个[],那么栈头就是列表最右端,栈尾是最左端,于是栈头到栈尾递增,其实是列表从左到右递减。顺序的描述为 从栈头到栈底的顺序。使用 pop()的操作,栈是后进先出。
其他的内容,还是看题解吧,看图解,不然也不好理解:每日温度-单调栈
边界条件:无
时间复杂度:O(n)
空间复杂度:O(n)
class Solution(object):
def dailyTemperatures(self, temperatures):
answer = [0] * len(temperatures)
stack = [0]
for i in range(1, len(temperatures)):
if temperatures[i] <= temperatures[stack[-1]]:
stack.append(i)
else:
# 这里还需要再次判断i和stack[-1]的大小
while stack and temperatures[i] > temperatures[stack[-1]]:
answer[stack[-1]] = i - stack[-1]
stack.pop()
stack.append(i)
return answer
496.下一个更大元素 I
题目链接:https://leetcode.com/problems/next-greater-element-i/
解法:
这个题和上一个题差不多,可以分两步走,第一步完全和上一题相同,找到nums2中的下一个最大元素,只不过这题是取元素本身而不是差值。第二步再找到nums1中元素在nums2中的index,再取出下一个最大元素即可。
为了减少空间复杂度,可以并为一步(一次for循环)来解决,也就是如果找到了下一个最大元素,再进一步判断当前的元素是否在nums1里面,是就放到result里。而且result的长度和nums1的长度一致。
边界条件:无
时间复杂度:O(n)
空间复杂度:O(n)
class Solution(object):
def nextGreaterElement(self, nums1, nums2):
result = [-1] * len(nums1)
stack = [0]
for i in range(1, len(nums2)):
if nums2[i] <= nums2[stack[-1]]:
stack.append(i)
else:
# 这里还需要再次判断i和stack[-1]的大小
while stack and nums2[i] > nums2[stack[-1]]:
if nums2[stack[-1]] in nums1:
idx = nums1.index(nums2[stack[-1]])
result[idx] = nums2[i]
stack.pop()
stack.append(i)
return result