像窗口一样滑动,窗口内大部分元素不变
用于解决数组/字符串的子元素问题
查找满足一定条件的连续区间的问题
当区间发生变化时,可以通过旧有的计算结果对搜索空间进行剪枝
从而减少重复计算,降低时间复杂度。
窗口大小固定的代码示例:
题目:给定一个整数数组,计算长度为k的连续子数据的最大总和。
解法:创建一个大小为k的窗口,窗口从左向右滑动
求和:减左侧出窗值,加右侧新入窗值 减少重复运算
public int maxSum(int[] arr,int k){
int n = arr.length;
if(n<k)return 0;
int maxSum = 0;
for(int i=0;i<k;i++){
maxSum+=arr[i];
}
int sum = 0;
for(int i=k;i<n;i++){
sum+=arr[i]-arr[i-k];
maxSum=Math.max(sum,maxSum);
}
return maxSum;
}
窗口大小不固定的模版示例: