Sliding Window

滑动窗口

技巧核心时间 O(n)空间 O(1) ~ O(k)

维护一段连续子数组,右端扩张、左端收缩,窗口内统计一次更新。

动画

7
0
2
1
9
2
4
3
1
4
8
5
5
6
3
7

滑动窗口:长度为 3 的最大子数组和

1 / 8

  • 默认

讲解

定长 / 不定长子数组最值、最少覆盖、最长无重复子串。

  1. 01定长:先填满 k 个,再每次右进一、左出一。
  2. 02不定长:右指针扩张,直到不满足条件,再移动左指针。
  3. 03窗口内用哈希或计数器维护状态。

易错点

  • 更新答案的时机:扩张后还是收缩后,要想清楚。
  • 左指针只前进不回退,才能保证 O(n)。

代码

function maxWindowSum(a, k) {
  let sum = class="text-accent">0;
  for (let i = class="text-accent">0; i < k; i++) sum += a[i];
  let best = sum;
  for (let r = k; r < a.length; r++) {
    sum += a[r] - a[r - k];
    best = Math.max(best, sum);
  }
  return best;
}

相关课题