LeetCode239_滑动窗口最大值

1. 题目

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。

示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

示例 2:
输入:nums = [1], k = 1
输出:[1]
 
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
1 <= k <= nums.length

2. 题解

2.1 滑动窗口法
import sys
from typing import List


class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        n = len(nums)
        # 如果数组为空 或是k=0
        if n * k == 0:
            return []

        # 如果数组只有1个元素,直接返回该元素
        if n == 1:
            return [nums[0]]

        # 初始化队列和结果,队列存储数组的下标
        queue = []
        res = []
        for i in range(n):
            # 如果当前队列最左侧存储的下标等于 i-k 的值,代表目前队列已满。
            # 但是新元素需要进来,所以列表最左侧的下标出队列
            if queue and queue[0] == i - k:
                queue.pop(0)

            # 对于新进入到元素,如果队列前面的数比它小,那么前面的需要出队列
            while queue and nums[queue[-1]] < nums[i]:
                queue.pop()
            queue.append(i)     # 新元素

            # 当前的大值加入到结果数组中
            if i >= k - 1:
                res.append(nums[queue[0]])
        return res


if __name__ == "__main__":
    s = Solution()
    nums = [1,3,-1,-3,5,3,6,7]  
    a = s.maxSlidingWindow(nums, 3)
    print(a)
2.2 滑动窗口(推荐)
import collections
from typing import List


# 暴力法,超时
class Solution:
    def maxSlidingWindwo(self, nums: List[int], k: int) -> List[int]:
        n = len(nums)
        if n * k == 0:
            return []
        if n == 1:
            return [nums[0]]

        # 初始化队列和结果
        q = collections.deque()
        res = []

        for i in range(n):
            # 当前队列最左侧存储的下标等于i-k时,表示存满了
            if q and q[0] == i - k:
                q.popleft()

            # 对于新加入的元素,如果队列前面的数字比它小,则前面的全部出列
            while q and nums[q[-1]] < nums[i]:
                q.pop()

            # 新元素入列
            q.append(i)

            # 开始计数
            if i >= k - 1:
                res.append(nums[q[0]])

        return res
2.3 暴力法(超时)
from typing import List


class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        n = len(nums)
        if n * k == 0:
            return []
        out = []
        for i in range(n - k + 1):
            left = i
            right = i + k
            out.append(max(nums[left:right]))
        return out


if __name__ == "__main__":
    s = Solution()
    nums = [1,3,-1,-3,5,3,6,7]
    a = s.maxSlidingWindow(nums, 3)
    print(a)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值