2026/1/14 5:58:21
网站建设
项目流程
前端怎么在猪八戒网站接单做,中山精品网站建设信息,中国菲律宾商会会长,广东网站备案审核时间场景想象#xff1a;
你有一条毛毛虫#xff08;窗口#xff09;#xff0c;它趴在一个数字数组上。
它的目标是#xff1a;吃够一定的“营养值”#xff08;数组元素之和 $\ge$ target#xff09;。 策略#xff1a; 进食#xff08;右指针向右伸#xff09;…场景想象你有一条毛毛虫窗口它趴在一个数字数组上。它的目标是吃够一定的“营养值”数组元素之和 $\ge$ target。策略进食右指针向右伸为了吃饱它必须把头往前伸把新的数字吞进来。消化左指针向右缩一旦吃饱了和 $\ge$ target它觉得自己太胖了为了保持“身材苗条”长度最小它会尝试把尾巴缩回来吐出左边的数字看看是不是还能保持饱腹状态。这就是滑动窗口的核心逻辑进窗口 - 判断 - 出窗口。力扣 209. 长度最小的子数组https://leetcode.cn/problems/minimum-size-subarray-sum/题目分析输入正整数数组nums正整数target。目标找到一个连续子数组使得其和 $\ge$target。输出满足条件的最小长度。如果没有返回 0。例子target 7, nums [2, 3, 1, 2, 4, 3][2, 3, 1]和是 6不够。[2, 3, 1, 2]和是 8够了长度 4。尝试缩尾巴去掉 2[3, 1, 2]和是 6不够了。继续伸头...[3, 1, 2, 4]和是 10够了缩尾巴去掉 3[1, 2, 4]和是 7够了长度 3。再缩尾巴去掉 1[2, 4]和是 6不够。继续伸头...[2, 4, 3]和是 9够了缩尾巴去掉 2[4, 3]和是 7够了长度 2。再缩尾巴去掉 4[3]和是 3不够。最终答案2。核心思维$O(N)$ 的魔法如果用暴力解法我们需要两层循环枚举所有起点和终点复杂度是 $O(N^2)$。而滑动窗口只需要两个指针配合right 指针主动走left 指针被动走。每个元素最多被“进窗口”一次被“出窗口”一次。所以复杂度是 $O(N)$。代码实现 (JavaScript)这是滑动窗口最标准的模板背下来能应付 80% 的同类题。JavaScript/** * param {number} target * param {number[]} nums * return {number} */ var minSubArrayLen function(target, nums) { let left 0; // 窗口左边界 let right 0; // 窗口右边界 let sum 0; // 窗口内元素的和 let result Infinity; // 记录最小长度初始化为无穷大 // 1. 右指针主动向右滑动扩大窗口 while (right nums.length) { // --- 进窗口 --- sum nums[right]; // 2. 当窗口内的和满足条件时尝试收缩左边界 // 注意这里用 while因为可能需要连续缩好几次 // 比如 [100, 1, 1, 1], target100。读到100时直接满足后面可能还要继续缩。 while (sum target) { // 更新最小长度 let currentLen right - left 1; result Math.min(result, currentLen); // --- 出窗口 --- sum - nums[left]; left; // 左边界向右收缩 } // 继续寻找下一个 right; } // 如果 result 还是 Infinity说明整个数组加起来都没 target 大 return result Infinity ? 0 : result; };深度辨析为什么是 While 而不是 If在收缩窗口的时候JavaScriptwhile (sum target) { ... }很多初学者会写成 if。如果是 if意味着你每加进来一个新数字左边最多只缩一步。但在本题中假设 nums [1, 1, 1, 1, 100], target 100。当right走到100时sum变成了 104。此时满足条件。如果你只缩一步去掉第一个 1sum变成 103还是满足条件其实应该继续缩我们需要把左边的1, 1, 1, 1全部缩掉只留下[100]才能得到最优解。所以必须用while直到不能缩为止。总结这道题是不定长滑动窗口的开山之作。特征求“最长/最短/满足条件”的连续子数组。模板外层循环移动right扩张。内层循环移动left收缩寻找最优解。下一题预告无重复字符的最长子串接下来这道题LC 3. 无重复字符的最长子串是 LeetCode全站排名第一的题目无论按热度还是按面试频率。它也是滑动窗口但稍微变了一点点这一次窗口收缩的条件不是“和大于等于 target”而是**“窗口里出现了重复字符”**。比如abcabcbb当你遇到第二个a时左指针该怎么动准备好挑战这道**算法界的“Hello World”**了吗