leetcode系列题二----查找最大最小值
这类的题一般的思路为:创建->复杂度O(1)查找最大最小值
面试题30. 包含 min 函数的栈 (额外stack非严格降序方式来保存最小值,时间复杂度O(1),空间复杂度O(n))
剑指 Offer 59 - I. 滑动窗口的最大值
(其他刷到再补充,好像还有一道用小顶堆做的题,忘记题号了,遇到再补上)
通用思路
这种对查找有时间复杂度限制的情况一般是要求你在创建数据时是有序创建,否则的话无论是使用max还是其他方法复杂度都是O(n)
以包含 min 函数的栈为例,存入stack的时候,需要用一个额外的stack以非严格降序的方式保存min值,或者通过大顶堆和小顶堆的方式解决。都是以空间换时间的思路。
额外队列或stack
(以滑动窗口最大值为例)
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
a = 0
b = k-1
res = []
if len(nums)<k:
return []
# 利用队列deque保存当前滑动窗口的最大值,如果新加入比deque最后一个数大,那就一直删除到大于等于的位置再append
deque = []
# 前k个情况,单独拎出来
for i in range(k):
if len(deque) > 0 and nums[i]>deque[-1]:
while len(deque)>0 and deque[-1] < nums[i]:
deque.pop()#默认pop(-1)
deque.append(nums[i])
else:
deque.append(nums[i])
if len(deque) > 0:
res.append(deque[0])
# 满足滑动窗口长度后
for i in range(1,len(nums)-k+1):
l = a+i
r = b+i
if nums[l-1] == deque[0]:
deque.pop(0)
if len(deque) > 0 and nums[r] > deque[-1]:
while len(deque)>0 and deque[-1]<nums[r]:
deque.pop()
deque.append(nums[r])
else:
deque.append(nums[r])
res.append(deque[0])
return res
大顶堆,小顶堆
刷到那道题更