239. 滑动窗口最大值

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

python 复制代码
class Solution(object):
    def maxSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        length= len(nums)
        if length == 0: return []
        elif length < k: return [max(nums)]
        else:
            from collections import deque
            q = deque()
            res=[]
            for id,num in enumerate(nums):
                #当队列不为空,且队首元素已不在窗口内时,将队首元素弹出
                while q and q[0] <= id-k:
                    q.popleft()
                #当队列不为空,且当前元素大于队尾元素时,将队尾元素弹出
                while q and nums[q[-1]] < num:
                    q.pop()
                #将当前元素入队
                q.append(id)
                if id >= k-1:
                    res.append(nums[q[0]])
            return res        

暴力法非常简单,但是在应对大数据的时候时间超时;

维护一个双端队列,数值从大到小,并且队列里的值存放的是数值的数组下标,而不是数值本身。

队首元素保证是最大元素,也就是说只要队首元素在滑动窗口内,就是最大值。而当不在时,就可以直接弹出,存放到结果集。

而在队尾加入元素时,要保证加入的元素不能比滑动窗口已有的元素大,也就是在加入之前,弹出那些比自己小的元素。

相关推荐
爱吃苹果的梨叔2 小时前
2026年KVM over IP采购指南:BIOS级接管、并发和审计怎么验收
ide·python·tcp/ip·github
Cloud_Shy6182 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第六章 Item 40 - 43)
android·开发语言·人工智能·笔记·python·学习方法
装不满的克莱因瓶2 小时前
掌握生成对抗网络(GAN)的优化目标与评估指标——从博弈函数到生成质量衡量体系
人工智能·python·深度学习·算法·机器学习
半只小闲鱼2 小时前
配置计划模块通用办公设备家具批复数合计计算
开发语言·python
是阿千呀!2 小时前
A股市场风格切换研究:基于 Barra 风险模型的量化框架
python·量化
大蚂蚁2号2 小时前
短视频批量生成技术深度解析与实战方案
python·aigc·音视频
努力写A题的小菜鸡2 小时前
PyTorch 两种卷积写法彻底对比:F.conv2d 函数式 vs nn.Conv2d 类实战(超详细入门笔记)
python
golfscript2 小时前
Playwright Python:微软出的浏览器自动化库
python·其他·microsoft·自动化
charliedev2 小时前
Jedi:Python 自动补全与静态分析的实用工具
开发语言·python·其他