给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
进阶:
你能在线性时间复杂度内解决此题吗?
提示:
- 1 <= nums.length <= 10^5
- -10^4 <= nums[i] <= 10^4
- 1 <= k <= nums.length
思路:
把元素依次push进queue。如果新加进来的元素比前面的所有元素都大,那就把前面所有的元素都弹出去。而且,queue中的元素数量如果多于k个,就也要弹出前面的元素。要保证queue中的元素数量小于等于k个。
pop方法:先检查queue是否为空,然后检查queue的头部元素是否为滑动窗口最左边的元素,如果是,就弹出。(因为queue中的元素从大到小排序,queue的头部元素不一定是滑动窗口的头部元素)
push方法:在向queue中添加新元素之前,先检查queue的尾部的元素是否有比新元素小的元素,如果有,就把所有比新元素小的元素都弹出,然后再把新元素加入queue,保证queue中的元素都是从大到小排序的。
front方法:这个方法返回queue的头部元素,也就是当前滑动窗口的最大值。
class MyQueue:
def __init__(self):
self.queue = deque()
def pop(self, value):
if self.queue and value == self.queue[0]:
self.queue.popleft()
def push(self, value):
while self.queue and value > self.queue[-1]:
self.queue.pop()
self.queue.append(value)
def front(self):
return self.queue[0]
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
que = MyQueue()
result = []
for i in range(k):
que.push(nums[i])
result.append(que.front())
for i in range(k, len(nums)):
que.pop(nums[i-k])
que.push(nums[i])
result.append(que.front())
return result
5月18日 重写 (报错):
class MyQueue:
def __init__(self):
self.queue = deque()
def pop(self, value):
if self.queue and self.queue[0] == value:
self.queue.popleft()
def push(self, value):
while self.queue and self.queue[-1] < value:
self.queue.pop()
self.queue.append(value)
def front(self):
return self.queue[0]
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
que = MyQueue()
res = []
for i in range(k):
que.push(nums[i])
for i in range(k,len(nums)):
que.pop(nums[i-k])
que.push(nums[i])
res.append(que.front())
return res
注意:deque,而不是dequeue
错误点:在把前k个元素push进去之后,要res.append(que.front()),然后再开始移动滑动窗口
修改之后:
class MyQueue:
def __init__(self):
self.queue = deque()
def pop(self, value):
if self.queue and self.queue[0] == value:
self.queue.popleft()
def push(self, value):
while self.queue and self.queue[-1] < value:
self.queue.pop()
self.queue.append(value)
def front(self):
return self.queue[0]
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
que = MyQueue()
res = []
for i in range(k):
que.push(nums[i])
res.append(que.front())
for i in range(k,len(nums)):
que.pop(nums[i-k])
que.push(nums[i])
res.append(que.front())
return res