定长滑动数组解题总结

使用场景

涉及比较,需要判断左右边界的移动时,可以使用滑动窗口来解决。

题目参考

problem:2090. 半径为 k 的子数组平均值

思路分析 (灵神模板)

  1. 入:将右边界nums[r] 加入窗口,若窗口长度不足k ,重复步骤1
  2. 比:一般求最大值 或者最小值 比较 加入答案即可
  3. 出:将左边界nums[r-k+1]移出窗口

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public int[] getAverages(int[] nums, int k) {
int n = nums.length;
int[] res = new int[n];

long cnt = 0;
for(int r = 0 ; r< n ;r++){
res[r] = -1;
int l = r - 2*k;
// 入
cnt += nums[r];
// 达不到窗口长度要求,重复步骤1
if(l < 0){
continue;
}
// 比:结果加入答案
res[r-k] = (int) (cnt / (2*k + 1));

// 出:移除左边界
cnt -= nums[l];

}
return res;
}
}