图解算法通识讲义经典套路

滑动窗口与动态伸缩模型

核心心智模型:伸缩自如的动态视窗:右边界无脑探路吃进,左边界按需收缩吐出,维护区间不变量。

核心交互式算法图解演练沙盒
滑动窗口模型

无重复字符滑动窗口动态伸缩演练

步骤 1 / 5
当前窗口区间:[0 ... 0]
窗口长度:1
历史最大长度 maxLen:1
→ 右边界扩张 right++
L
R
a[0]
b[1]
c[2]
a[3]
b[4]
c[5]
b[6]
b[7]
当前窗口字符集合 Set:
'a'
双指针推进总计 ≤ 2N · 耗时 O(N)

窗口初始化:left=0, right=0。字符 "a" 加入集合,当前无重复窗口长度为 1,更新 maxLen=1。

关键操作与时空复杂度速查对照表
操作 / 算法阶段平均时间最坏时间空间复杂度核心底层机制
单向滑动全量扫描O(N)O(N)O(K) ~ O(1)左右指针每个元素至多进出窗口各一次,总体线性。
template.java
Map<Character, Integer> window = new HashMap<>();
int left = 0, ans = 0;
for (int right = 0; right < s.length(); right++) {
    char c = s.charAt(right);
    window.put(c, window.getOrDefault(c, 0) + 1);
    while (window.get(c) > 1) {
        char d = s.charAt(left);
        window.put(d, window.get(d) - 1);
        left++;
    }
    ans = Math.max(ans, right - left + 1);
}
解题核心心法提炼
  • 核心前提是「单调性」:扩张窗口只能让某些指标单调递增,收缩窗口只能单调递减。
  • 更新全局最优结果的时机取决于问题:求最长通常在合法时更新;求最短通常在满足条件并收缩时更新。
  • 用频次数组 (int[128] 或 Map) 记录字符出现次数,以 O(1) 判定窗口是否合法。
常见踩坑警示与避坑指南
  • 收缩窗口时忘记在状态池中扣除 left 元素对计数器的贡献。
  • 更新结果的位置放错循环内外,导致边界窗口被遗漏。

对应 Hot 100 实战题目突围

原理已掌握!立即进入沉浸式工作台开始实战演练,强化代码肌肉记忆

查看全部题目