这题其实挺不好写的。知识点虽然重要,但细节非常繁琐,我这一次(20240709)花费了大概2个小时才写出这道题,但其实这还是我已经知道这道题是需要使用“单调队列”算法来求解,并我已事先学过单调队列算法了。所以知易行难,提升算法水平,还是需要老老实实的多敲代码。
1. 题目
题目的意思很好理解,就是求某个数组固定大小窗口内的最大值。
2. 分析
我写这部分代码的时候,犯了三个错误:
- 应该先把当前的数同队列尾部的数比较,然后处理;
- 当前的每个数都会被入队,但是后面入队的数可能会因为“质量”更高而把当前数从队尾移除。
- 不会熟练使用Python自身的队列结构,从而被迫使用数组模拟队列,导致代码变得复杂
3. 代码
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
que = [0 for i in range(len(nums))]
front = rear = 0
res = []
if k == 1:
return nums
for i in range(1, len(nums)):
#关键点1:先把队尾处理了,再处理队首。原因很简单:队尾可能就是当前元素
tail = que[rear]
while(nums[i] >= nums[tail] and (i-tail) < k and rear >= 0):
rear -= 1
if rear>=0:
tail = que[rear]
# 关键点2:无论当前来的是什么数,都会给它放到队列中
rear+=1
que[rear] = i
head = que[front]
while(i >= head + k and front <= rear):
front += 1
head = que[front]
if (i >= k-1): # 可以构成一个窗口
head = que[front]
res.append(nums[head])
return res