2026/2/9 22:30:17
网站建设
项目流程
wap手机网站静态模板,100个免费货源网站,网站内怎样做关键词有效果,中国源码网游戏开服滑动窗口 面试 刷题里性价比最高的算法之一什么时候用 → 本质 → 固定窗口 → 变长窗口 → 判断口诀一、一句话先建立直觉#xff08;最重要#xff09;当你在一个“连续区间”上#xff0c;反复计算某个指标#xff0c;且每次只移动一点点时#xff0c;就该想到滑…滑动窗口 面试 刷题里性价比最高的算法之一什么时候用 → 本质 → 固定窗口 → 变长窗口 → 判断口诀一、一句话先建立直觉最重要当你在一个“连续区间”上反复计算某个指标且每次只移动一点点时就该想到滑动窗口。关键词只有三个连续 区间 重复计算二、什么时候「一定」要用滑动窗口你看到题目里出现这些描述第一反应就该是它✅ 典型触发词题目描述为什么连续子数组 / 子串区间连续长度固定 k固定窗口至多 / 至少窗口可变最大 / 最小 / 最优比较窗口结果每次移动一步可复用上一次结果 什么时候不适合不要求连续子序列、组合窗口跳跃、随机访问区间大小完全不确定且不可单调调整三、滑动窗口的「本质」先想一个暴力解法枚举所有区间 → 每个区间重新算一遍O(n²) 或 O(n³)滑动窗口在干嘛我不重新算我只加一个新元素删一个旧元素O(n)这就是它的全部灵魂。四、第一种固定长度滑动窗口最好学典型问题长度为 k 的子数组最大和是多少暴力思路不要写for(i)for(ji..ik-1)sumnums[j];滑动窗口写法模板intwindowSum0;// 初始化第一个窗口for(inti0;ik;i){windowSumnums[i];}intmaxwindowSum;// 开始滑动for(intik;in;i){windowSumnums[i];// 加右边windowSum-nums[i-k];// 减左边maxMath.max(max,windowSum);}记忆口诀重要右边进左边出窗口长度始终不变五、第二种可变长度滑动窗口面试最爱典型问题最短子数组使得和 ≥ target思路非常重要右指针扩张满足条件左指针收缩尝试变优条件破坏 → 停止收缩模板intleft0;intsum0;intminLenInteger.MAX_VALUE;for(intright0;rightn;right){sumnums[right];while(sumtarget){minLenMath.min(minLen,right-left1);sum-nums[left];left;}}口诀必须背右扩张满足条件左收缩寻找最优六、什么时候用「固定」什么时候用「可变」情况用法长度固定k固定窗口长度不固定可变窗口要最大 / 最小两者都可能至多 / 至少可变窗口七、你刚做的股票题 固定窗口的变形你那题本质是长度为 k 的区间最大“增量”是多少✔ 连续✔ 长度固定✔ 比最大值100% 固定滑动窗口八、滑动窗口“识别口诀”送你看到题目问自己 3 个问题1. 要不要连续 2. 窗口会不会整体右移 3. 能不能用“加一个、减一个”更新结果三问全是「是」直接滑动窗口不要想 DP九、给你一个“肌肉记忆版”模板固定窗口模板背下来// initfor(inti0;ik;i){windowarr[i];}answindow;// slidefor(intik;in;i){windowarr[i];window-arr[i-k];ansMath.max(ans,window);}可变窗口模板背下来left0;for(right0..n-1){add(arr[right]);while(invalid()){remove(arr[left]);}updateAnswer();}十、最后一句话很重要滑动窗口不是一种技巧而是一种“拒绝重复计算”的思维方式题 1固定窗口LeetCode 643子数组最大平均数 I题意极简版给你一个数组找长度为 k 的连续子数组使它们的和最大。错误直觉不要做枚举所有区间 → 每个重新算和 → O(n²)正确直觉看到这句话就反射“长度固定 连续 最大” → 固定滑动窗口思维流程一定要记1. 先算第一个窗口 2. 右边进一个 3. 左边出一个 4. 更新答案Java 模板背intwindowSum0;// 1. 初始化窗口for(inti0;ik;i){windowSumnums[i];}intmaxSumwindowSum;// 2. 开始滑动for(intik;inums.length;i){windowSumnums[i];// 右进windowSum-nums[i-k];// 左出maxSumMath.max(maxSum,windowSum);}肌肉记忆点固定窗口 for 加一个 减一个题 2可变窗口 · 至少型LeetCode 209长度最小的子数组题意找一个最短的连续子数组使得和 ≥ target关键转变非常重要这里窗口长度不固定但有一个非常关键的特性窗口越大和只会越大正数数组这叫单调性一看到这个就能用滑动窗口思维流程牢记右指针负责扩张 → 直到满足条件 左指针负责收缩 → 尝试变短Java 模板必背intleft0;intsum0;intminLenInteger.MAX_VALUE;for(intright0;rightnums.length;right){sumnums[right];// 扩张窗口while(sumtarget){minLenMath.min(minLen,right-left1);sum-nums[left];// 收缩窗口left;}}3 肌肉记忆点“满足条件 → 左边能不能再缩”题 3可变窗口 · 计数型LeetCode 3无重复字符的最长子串题意找一个最长的子串里面没有重复字符为什么还是滑动窗口连续子串条件窗口内字符不能重复一旦重复 → 左边必须动这里的“窗口状态”是什么不是 sum而是窗口内字符的出现次数用HashSet或MapJava 模板经典中的经典SetCharactersetnewHashSet();intleft0;intmaxLen0;for(intright0;rights.length();right){charcs.charAt(right);// 出现重复 → 收缩左边while(set.contains(c)){set.remove(s.charAt(left));left;}set.add(c);maxLenMath.max(maxLen,right-left1);}肌肉记忆点“不合法 → 一直动左边直到合法”三道题 三种滑动窗口“人格”题类型你该想到什么最大和固定窗口加一个减一个最短满足可变窗口至少右扩张左收缩无重复可变窗口约束违规就缩最终「识别口诀」你以后靠它看到题目心里过这 4 句1. 连续吗 2. 能不能整体右移 3. 能不能用“加一个、减一个”维护状态 4. 是否存在“满足条件 / 不满足条件”的边界✔ 全是 →滑动窗口给你一个终极总结很重要滑动窗口不是算法是“不重复计算”的习惯