LeetCode 239. Sliding Window Maximum

Cloudflare 5秒盾破解实战:Python补环境框架下的13次请求全解析 本文深入解析Cloudflare 5秒盾(5-second challenge)的工作原理,并提供基于Python环境的自动化应对策略。通过13次请求流程分解、动态脚本处理技术和环境指纹模拟,帮助开发者有效绕过这一复杂的人机验证机制,提升自动化工作效率。 阅读详情

Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position.
题意:给你一个数组nums,有一个大小为k的滑动窗口从数组的最左移动到最右。你只能看到窗口里的k个数。窗口每次往右边滑动一个位置。

For example,
Given nums = [1,3,-1,-3,5,3,6,7], and k = 3.

Window position                Max
---------------               -----
[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

Therefore, return the max sliding window as [3,3,5,5,6,7].
Note:
You may assume k is always valid, ie: 1 ≤ k ≤ input array’s size for non-empty array.
注意:假设k总是有效,如 1 ≤ k ≤ 非空数组的大小

Follow up:
Could you solve it in linear time?
另外:你能否在线性时间内解决这个问题?

开始的解题思路,从左滑到右,记录窗口的最大值和最大值的索引:
1. 如果窗口滑动后,该最大值依然在窗口内,且大于窗口最右边的数,则该最大值依然是窗口的最大值。
2. 否则,重新在窗口内寻找最大值,并记录最大值的索引。

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        if(k == 1 || nums.empty()) return nums;

        int maxi = nums[0], iMax = 0;   // maxi 记录当前窗口最大数,iMax记录最大数的索引
        int l = 0, r = k - 1, n = nums.size() - 1;  // 窗口左右指针
        vector<int> res;             
        findMax(nums, l, r, maxi, iMax);    // 找到第一个窗口的最大数和其索引
        res.push_back(maxi);
        while(r < n){
            ++l; ++r;
            if(maxi > nums[r] && iMax >= l){    // 移动窗口后,原来最大的数大于窗口最右边的数,且原来最大的数在窗口内
                res.push_back(maxi);
                continue;
            }
            else{       // 原来最大的数不在窗口内
                findMax(nums, l , r, maxi, iMax);   // 重新找到最大数
                res.push_back(maxi);
            }
        }

        return res;
    }

private:
    // 找到[l, r] 范围内的最大数和其索引
    void findMax(vector<int>& nums, const int& l, const int& r, int& maxi, int& iMax){
        if(r >= nums.size()) return;

        maxi = nums[l], iMax = l;
        for(int i = l + 1; i <= r; ++i){
            if(nums[i] > maxi){
                maxi = nums[i];
                iMax = i;
            }
        }
    }
};

分析时间复杂度和空间复杂度:
Time Complexity:
最坏情况:当数组降序的时候,会发生最坏情况,每次都需要重新寻找最大值和索引,时间复杂度为O(n * k)
最好情况:[i - ( k - 1), i + k]中的最大值在i处,所以将数组分成 n / 2k 份,每份重新查找时间为k,时间复杂度为O( n / 2k * k) = O(n)
Space Complexity:
没有额外使用空间O(1)
这里写图片描述
参考讨论中的另一种方法,使用deque:
https://leetcode.com/problems/sliding-window-maximum/discuss/65884/Java-O(n)-solution-using-deque-with-explanation

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) 
    {
        std::deque<int> dq;
        std::vector<int> result;

        for(int i = 0; i < nums.size(); ++i) {
            if(!dq.empty() && dq.front() == i - k) {
                dq.pop_front();
            }

            while(!dq.empty() && nums[dq.back()] < nums[i]) 
                dq.pop_back();

            dq.push_back(i);

            if(i >= k - 1) {
                result.push_back(nums[dq.front()]);
            }
        }
        return result;
    }
};

Time Complexity:
对nums中的每一个数进出队列操作各一次,时间复杂度为O(2*n) = O(n)

CAN(2)-GD32 GD32中CAN的特征。 阅读详情

相关推荐

WSL基础环境配置方案

通过以上步骤,您已经在 Windows 的 WSL 环境中成功搭建了一个完整的基础开发环境,包含 Docker、Kubernetes、Helm、kubectl、yq、Git 等工具。这套环境特别适用于在国内使用阿里云镜像服务部署和管理 Tekton,提升了开发和运维的效率和稳定性。

落魄书生的职业学习生涯 8876

LeetCode 239 Sliding Window Maximum

LeetCode 239 Sliding Window Maximum 思路 相当有趣的一道题,除了暴力外有三种解法 有序集合 使用multiset,初始化前k个数,然后每次查找-删除-添加-取最大值即可。C++里set multiset是有序的,虽然不支持随机访问,但是指定greater模板参数后就可以直接使用*set.begin()获得最大值了。 双端队列 维护一个双端队列,该队列总是保持如下特性 队列中任一位置前的元素总比该位置的大 队列最前端元素是最大值 队列最大为k 上述特性能够保证在O(1)

EricJeffrey的博客 322

银河麒麟V10离线安装VLC播放器:依赖处理与3.0.9.2版本实操指南

在国产化操作系统日益普及的背景下,软件安装方式成为政企内网用户关注的重点。离线安装作为一种不依赖公网源的部署手段,常用于解决内网环境下的软件获取问题。其核心在于理解Linux包管理机制,如dpkg与apt对依赖关系的处理逻辑。掌握这一原理,不仅能应对多媒体软件的部署,也能提升系统维护效率。VLC作为跨平台多媒体播放器,凭借强大的解码能力与协议支持,广泛应用于本地视频播放、RTSP拉流及监控大屏等场景。本文从离线安装的通用概念出发,结合银河麒麟V10桌面版的实际环境,详细梳理了VLC 3.0.9.2离线包的获

weixin_32247165的博客 365

【leetcode】239. Sliding Window Maximum

求滑动窗口括起来的数组中的最大值。 最简单的方法就是暴力法,但时间复杂度为O(nk),这种hard题暴力法不用想都知道是不能过的。 思路1: 使用双端队列。用双端队列作为存储空间,存储方法如下 从左往右依次遍历数组,如果队列为空,那么将当前元素的添加到队列的左边(index和元素是一一对应的,入栈index相当于入栈了元素) 如果当前队列不为空,且当前元素小于等于队列最右端元素,那么将当前元素...

很吵请安静 799

告别单一查询!MultiQueryRetriever在LangChain中的高级用法解析

本文深入解析了LangChain中的MultiQueryRetriever高级用法,该工具通过大语言模型自动生成多样化查询,显著提升文档检索的召回率和准确性。文章详细介绍了其核心机制、高级配置调优策略以及在多语言和专业领域中的实际应用,为开发者提供了优化知识库问答系统的实用方案。

weixin_28730927的博客 271

奥比中光Gemini335L SDK实战:从标定参数到3D点云转换

本文详细介绍了奥比中光Gemini 335L深度相机的SDK实战应用,重点讲解如何跳过繁琐的棋盘格标定,直接调用出厂预标定参数实现高效的3D点云转换。通过解析内参、外参获取及四种核心坐标转换模式,并结合OpenCV等工具,指导开发者快速将相机集成到机器人抓取、三维测量等项目中,实现开箱即用的3D视觉解决方案。

raspberrypi5的博客 638

LeetCode 239. Sliding Window Maximum 题解

本题是单调队列的经典应用。使用双端队列维护单调递减序列队首是当前窗口的最大值及时移除不在窗口内和较小的元素。

cannonjinx的博客 2656

DeepSeek-V4-Pro 正式版突袭上线:Agent 能力暴涨,DeepSWE 直接干翻 Claude Opus 4.8

8 月 12 日深夜,DeepSeek 悄悄在 API 文档里上架了一个新版本号——DeepSeek-V4-Pro-0813。第二天(13 日),这个版本被确认为 V4 Pro 正式版。没有发布会,没有预热,只改了版本号,就把整个 AI 圈的注意力又抢了过去。

2601_96613114的博客 837

[Leetcode]_239 Sliding Window Maximum

/** * Index: 239 * Title: Sliding Window Maximum * Author: ltree98 **/ 题意 给定一个数组, 有一个长度为k的窗口从数组头部开始向后滑动,每次滑动1位; 输出每次窗口内最大值序列。 注意: k保证是合法的,即 k >= 1 且 k <= 数组长度 数组不会为空 测试样例中存在数组为空的情况 我...

继续激情,继续奋斗。 483

Verilog HDL 100道面试题及参考答案

在 Verilog HDL 中,参数(parameter)和宏定义(define)都可用于定义常量,但它们存在诸多不同之处。参数(parameter)是模块内部的常量定义,具有局部性。它在模块内部起作用,不同模块可以有同名的参数,且值可以不同。参数通常用于定义模块的一些配置信息,例如数据位宽、延迟时间等。参数的定义和使用是在模块的作用域内进行的,通过参数传递可以方便地对模块进行配置。endmodule在上述代码中,WIDTH是一个参数,用于定义加法器的位宽。通过改变WIDTH。

大模型大数据攻城狮的专栏 1728

FortiWeb 相对路径遍历漏洞复现(CVE-2025-64446)

FortiWeb是Fortinet公司推出的企业级Web应用防火墙(WAF),专为保护Web应用和API抵御高级威胁设计。它集成人工智能与机器学习技术,通过双层检测引擎(HMM模型与SVM向量机)精准识别异常流量,可防御OWASP Top 10攻击、SQL 注入、XSS、DDoS及恶意机器人。其核心功能包括API自动化保护、虚拟补丁集成(兼容Acunetix等第三方扫描工具)及智能流量分析,支持HTTP/2、WebSocket等现代协议。(CVE-2025-64446)

iSee857的博客 466

【Leetcode】239. Sliding Window Maximum

这是一道很简单的单调队列的应用。单调队列简单的说,就是一种每次加元素的同时,要保持队列单调性的数据结构。本题基本思路是,维护一个双端队列,使得队列头就是当前滑动窗口的最大值,然后队列第二个数就是当前滑动窗口的次大数,以此类推。维护的方式是,每push一个数进去的时候,就把比该数小于等于的队列尾的数全pop出来,然后如果队首数字已经脱离了滑动窗口,也要pop出来。每次操作完后把队头的数加入最后结果,最后返回。,返回一个数组,每个数字代表原数组每。个数的滑动窗口的最大值。

数学、算法爱好者的博客 330

华为OD机考真题 新系统 - 小菊的寻宝之旅(Java/Py/C/C++/Js/Go)

华为OD机试真题 新系统【小菊的寻宝之旅】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【小菊的寻宝之旅】多语言题解。

qq_45776114的博客 616

LeetCode //C - 239. Sliding Window Maximum

【代码】LeetCode //C - 239. Sliding Window Maximum。

Made in Code 1108

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

leetcode 239: Sliding Window Maximum

leetcode 239: Sliding Window Maximum python c++ java

西施豆腐渣 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Leetcode 239. Sliding Window Maximum (python&c++)

Leetcode 239. Sliding Window Maximum题目:解法:deque实现的单调队列 题目: 解法:deque实现的单调队列 关于单调队列的解释:https://medium.com/algorithms-and-leetcode/monotonic-queue-explained-with-leetcode-problems-7db7c530c1d6 举个例子来说明单调队列,现在有个递减的单调队列[6,4,3]: 新元素为2,队列变为[6,4,3,2] 新元素为5,队列变为[6

qq_37821701的博客 471

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Leetcode 239. Sliding Window Maximum

题目描述:给出一个数组以及大小为k的滑动窗口,返回每个窗口中的最大值。 题目链接:Leetcode 239. Sliding Window Maximum 最简单的思路就是遍历然后用max函数返回最大值,但是这样的话每次都要遍历一次来找最大值。如果是笔试遇到可以这样做,如果是面试过程中就就应该提出一些更好的idea比如滑动过程中维护一个有序的窗口,画一格,加入的和退出的值。 大概思路是用双向...

Za七杂⑧ 239

[Leetcode 239, Hard] Sliding Window Maximum

[Leetcode 239, Hard] Sliding Window Maximum

算法的实践 591

Leetcode 239. Sliding Window Maximum(python)

Leetcode 239. Sliding Window Maximum题目解法1:brutal force解法2:利用单调递减双向队列解法3:动态规划,构建左右最大数组 题目 Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the...

qq_37821701的博客 622

[leetcode] 239. Sliding Window Maximum 解题报告

题目链接: https://leetcode.com/problems/sliding-window-maximum/ Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. Y

小榕流光的专栏 1364

[leetcode 239]Sliding Window Maximum

Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window

ER_Plough的专栏 844

LeetCode239:Sliding Window Maximum

Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window m...

卷卷萌的博客 301

leetcode 239 Sliding Window Maximum

Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window...

LOVETEDA的博客 352

Leetcode-239. Sliding Window Maximum

leetcode

技术与生活齐头并进 1030

LeetCode: 239. Sliding Window Maximum

LeetCode: 239. Sliding Window Maximum 题目描述 Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in...

杨领well的专栏 142

LeetCode239 Sliding Window Maximum

Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window

suichen1的专栏 484
上一篇: [牛客网题库] 被3整除
下一篇: LeetCode 300. Longest Increasing Subsequence
Spade_
博客等级 码龄10年 918粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值