当前位置: 首页 > news >正文

算法入门(一):滑动窗口 之 可变窗口-求最短 / 最长-数值计算 (Leetcode 209 / 713 / 2875 / 1004 / 2024)

算法入门(一):滑动窗口 之 可变窗口-求最短 / 最长-数值计算 (Leetcode 209 / 713 / 2875 / 1004 / 2024)

  • 可变窗口-求最短 / 最长
  • 模板 / 思维方式
  • 数值计算
    • Leetcode 209
    • Leetcode 713
    • Leetcode 2875
    • Leetcode1004 / 2024

可变窗口-求最短 / 最长

可变窗口的核心是维护一个始终满足条件的窗口:

  • 扩展:一般来说都是向右,将最右侧的元素加入窗口做一些动作
  • 收缩:到条件被破坏时,将最左侧的元素移除,直到条件重新满足
  • 统计:统计一些窗口的数据,例如窗口长度
  • 这类题目非常灵活,没有固定代码模板,只有思维模板
    题目分两种类型:
  • 纯数值的简单情况
  • 字符串/哈希表/队列/栈/堆的复杂情况。

模板 / 思维方式

// 思维方式(理解这个逻辑)intleft=0;for(intright=0;right<n;right++){// 1. 扩展窗口:加入新元素窗口加入 nums[right];// 2. 收缩窗口:直到窗口重新满足条件while(窗口不满足条件&&left<=right){窗口移除 nums[left];left++;}// 3. 统计:此时窗口一定满足条件if(条件满足){统计当前窗口;}}

数值计算

Leetcode 209

该题没法使用模板,明确2 移除元素的动作 和3 统计量就可以了。

intminSubArrayLen(inttarget,vector<int>&nums){intn=nums.size();intminLen=INT_MAX;intwindowSum=0;intleft=0;intright=0;for(;right<n;right++){windowSum+=nums[right];while(windowSum>=target){//满足条件minLen=min(minLen,right-left+1);//更新结果windowSum-=nums[left];//更新窗口left++;//更新边界}}returnminLen<=n?minLen:0;}

Leetcode 713

遵循扩展,条件,统计的思考方式:

  • 扩展: product *=nums[right];
  • 条件:当积大于等于k的时候,窗口需要收缩;
  • 统计:当积严格小于k的时候,统计该次right存在时的满足条件的长度,累加起来。
intnumSubarrayProductLessThanK(vector<int>&nums,intk){intn=nums.size();longlongproduct=1;intleft=0;intright=0;intres=0;for(;right<n;right++){product*=nums[right];while(product>=k&&left<=right){product/=nums[left];left++;}res+=right-left+1;}returnres;}

Leetcode 2875

Leetcode209的扩展题。
一般会考虑两轮就覆盖所有情况,于是数组下标采取 % n 取mod:

classSolution{public:intminSizeSubarray(vector<int>&nums,inttarget){intn=nums.size();intsum=0;intleft=0;intright=0;intres=INT_MAX;for(;right<n*2;right++){sum+=nums[right%n];while(left<=right&&sum>target){sum-=nums[left%n];left++;}if(sum==target)res=min(res,right-left+1);}returnres==INT_MAX?-1:res;}};

可惜只能通过 80 %的用例。

如果情况是[1,2],target = 7,[1,2,1,2,1,2,1,2…],需要大于两组的和才能得到targer ,所以不能只在 2n 范围内搜索。
接下来要做出修改:

  • 判断条件:是否等于 target 变更为 target % total
  • 答案:res需要加上 target / total * n ,即多出来的组数 x 每一组的数量 。
classSolution{public:intminSizeSubarray(vector<int>&nums,inttarget){//1. 计算总和longlongtotal=0;for(intnum:nums)total+=num;//2. 滑动窗口,判断条件全部变为取模intn=nums.size();intsum=0;intleft=0;intright=0;intres=INT_MAX;for(;right<n*2;right++){sum+=nums[right%n];while(left<=right&&sum>target%total){sum-=nums[left%n];left++;}if(sum==target%total)res=min(res,right-left+1);}//3. 结果记得也加上取模的变化returnres==INT_MAX?-1:res+target/total*n;}};

Leetcode1004 / 2024

Leetcode1004 / 2024 是同一种题目: nums[]只有两种元素的情况下,如何使用滑动窗口。

http://www.jsqmd.com/news/1099046/

相关文章:

  • 如何5分钟搞定B站抢票:告别手速焦虑的自动化神器指南
  • 2026年全球范围内最佳高端品牌网站建设公司服务商排行榜,测评零代码、低代码、定制工具
  • 学长走心分享|在线动漫信息平台全套源码+论文,二次元特色毕设课设亮眼选题!
  • 5分钟掌握SVG-Edit:浏览器中创建专业矢量图形的终极解决方案
  • STM32 SPI控制器
  • 【MySQL】列的增删查改
  • 字幕编辑革命:如何用Subtitle Edit实现专业级字幕制作
  • Kafka-UI安全加固:如何解决生产环境权限失控问题
  • [QT]重载qdbug
  • 面向AI ASIC上全同态加密NTT加速的低成本多精度脉动阵列
  • 【RL】GRPO
  • VMware虚拟机安装Ubuntu完整指南:从零搭建安全可控的开发环境
  • MySQL数据分析实战:从零构建SQL查询到业务问题解决
  • 如何零基础掌握文本分析:KH Coder的完整新手指南
  • Mate Engine虚拟角色引擎:模块化VRM桌面伴侣的技术实现方案
  • 2026年循环提升机厂家综合实力排名:技术、服务与口碑的全方位较量
  • 性能数据从 CSV 到 Excel:移动端测试报表自动化处理思路
  • 【QT】模板如何使用
  • 2026年7月零代码网站搭建与企业无代码建站工具测评:谁更适合你,
  • MySQL实战指南:从SQL语法到索引优化与生产环境调优
  • 计算机毕业设计之基于SSM的校园共享单车管理系统设计与实现
  • 速来薅羊毛!8元免费得
  • Claude Code(15):CodeGraph - 给 AI 装上代码地图,少读文件、少烧 Token
  • VR-Reversal:3分钟将VR视频变成普通播放器可看的2D影片
  • UE 移动端 CPU、GPU、内存问题怎么归因:一套性能分析方法
  • RAG 真正让人头疼的地方,从来不是“搭不起来”
  • 抖音无水印下载技术解析:从录屏到原生文件获取的革命
  • 反射使用详解
  • 管人这件事:三流领导靠罚,二流靠制度,一流靠方法
  • Dify实战教程:从零搭建企业级AI应用,掌握低代码开发与工作流设计