最近做了几道有关滑动窗口的算法,在此总结一下。
滑动窗口
- 就像描述的那样,可以理解成是一个会滑动的窗口,每次记录下窗口的状态,再找出符合条件的适合的窗口
- 可以使用滑动窗口来减少时间复杂度
经典滑动窗口题目
给一组大小为n的整数数组,计算长度为k的子数组的最大值
比如:数组{1,2,3,4,5,7,6,1,8},k=2,那么最终结果应该是7+6=13最大。
最简单的是使用两层遍历,通过所有情况找出最大的一个子数组,时间复杂度O(N^2)
使用滑动窗口,从[0,k-1]的一个窗口,记录其总和,然后窗口向右移动到[1,k],再到[2,k+1],直到数组的最尾端,找出里面总和最大的一个窗口,这样的解法就是滑动窗口算法。
//Java代码:
public class SlidingWindow {
public static int maxnum(int[] array,int k){
if(array.length<k){//如果k比数组长度还大,返回-1
return -1;
}
int left=0;
int sum=0;
for(int i=0;i<k;i++){
sum+=array[i];
}
int tempsum=sum;//tempsum记录每个窗口的总和
while (left+k<array.length){
tempsum=tempsum-arra