Leetcode Link: 239. 滑动窗口最大值 - 力扣(LeetCode)
题目
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。

解法一
思路: 暴力冲,每个窗里用max
题解:
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
if k >= len(nums):
return [max (nums)]
# 添加第一个窗的结果
res = [max (nums[: k])]
# 遍历后面的
for i in range(k, len(nums)):
res.append(max(nums[i-k+1:i+1]))
return res
解法二
思路:
既然暴力不行,那言外之意就是告诉我们不能每次都调用 max(),而是尽量直接取,因此我们必然使用的是单调队列。
在python中,使用SortedList即可,详细使用说明可以参考设计食物评分系统
题解:
from sortedcontainers import SortedList
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
if k >= len(nums):
return [max(nums)]
bucket = SortedList(nums[:k])
res = [bucket[-1]]
for i in range(k, len(nums)):
bucket.add(nums[i])
bucket.remove(nums[i-k])
res.append(bucket[-1])
return res解法三
思路:
题解: