flowchart TD
A[开始] --> B[right++ 扩大窗口]
B --> C[更新窗口状态]
C --> D{需要收缩?}
D -->|否| E{还有元素?}
D -->|是| F[更新结果]
F --> G[left++ 收缩窗口]
G --> H[更新窗口状态]
H --> E
E -->|是| B
E -->|否| I[结束]
核心步骤
初始化:设置 left=0, right=0, 结果=0, 窗口状态为空
扩大窗口:right++,入窗口,更新状态
收缩窗口:while(条件满足),出窗口,更新结果,left++
更新结果:根据题目要求取最大/最小值
固定窗口模板
// 例:求长度为 k 的子数组最大平均值var findMaxAverage = function (nums, k) { let avg = 0; let max = -Infinity; for (let i = 0; i < nums.length; i++) { avg += nums[i] // 入 let left = i - k + 1 if (left < 0) continue; max = Math.max(avg, max) // 更新 avg -= nums[left] // 出 } return max / k};
可变窗口模板
// 例:无重复字符的最长子串function lengthOfLongestSubstring(s) { const window = new Set(); let left = 0, maxLen = 0; for (let right = 0; right < s.length; right++) { while (window.has(s[right])) { window.delete(s[left]); // 收缩 left++; } window.add(s[right]); // 扩大 maxLen = Math.max(maxLen, right - left + 1); } return maxLen;}