一、 滑动窗口的定义
滑动窗口是一种算法技术,用于处理基于连续子数组或子字符串的问题。它通过在数组或字符串上移动一个固定大小的窗口,并在每个位置上进行相关操作来解决问题。
滑动窗口算法的基本思想是维护两个指针,一个指向窗口的起始位置,另一个指向窗口的结束位置。通过移动这两个指针,可以在不重复地遍历整个数组或字符串的情况下解决问题。
二、滑动窗口的使用场景
滑动窗口常用于解决以下类型的问题:
1. 找出最长的连续子数组或子字符串,满足一定的条件。
2. 统计满足特定条件的子数组或子字符串的个数。
3. 查找满足特定条件的最小或最大子数组或子字符串。
滑动窗口算法具有较高的时间效率,通常可以在O(n)的时间复杂度下解决问题。它的核心在于合理地更新窗口的起始位置和结束位置,以满足问题的要求。
三、实例:使用滑动窗口求长度最小的子数组
题目描述:在一个正整数数组nums中找到最小长度的连续子数组,使子数组元素之和大于或等于target。返回满足条件的子数组的最小长度,如果没找到则返回0。
输入:target = 12 ,array = [4,6,2,4,9,8,7]。
输出:2
1、暴力解法
public static int minSubArrayLen(int target, int [] array){
int result = array.length +1 ;
int sum = 0; //子数组的元素之和
int subLength = 0;//子数组的长度
for (int i = 0; i < array.length; i++){
sum = 0;
for (int j = i; j < array.length; j++){
sum += array[j];
if(sum >= target){
subLength = j - i + 1;
result = subLength < result ? subLength : result;
break;
}
}
}
return result =result == array.length + 1 ? 0 : result;
}
时间复杂度:O()
空间复杂度:O (1)
2、滑动窗口解法
public static int minSubArrayLen(int target, int[] array){
int result = array.length +1;
int sum = 0; //滑动窗口之和
int subLength = 0; //滑动窗口的位置
int i = 0; //滑动窗口的初始位置
for (int j = 0; j < array.length; j++){
sum += array[j];
while ( sum >= target){
subLength = j - i + 1;//获取子数组长度
result = result < subLength ? result : subLength ;
sum -= array[i++];
}
}
return result = result ==array.length ? 0 : result;
}
时间复杂度:O(n)
空间复杂度:O (1)