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

解法三

思路

题解

启发和联系