滑动窗口总结
- 滑动窗口中的窗口通常是由双指针维护的
- 在算法题里常常是右指针向右移动找到满足题意的情况,此时窗口变大
- 如果向右移动时不满足题意,则左指针向右移动直至重新满足题意
滑动窗口题模板:
public static void slide(int[] nums,int k){
int l = 0;//左指针
int res = 0;//记录题目所需的最大或最小长度等
int sum = 0;//记录总和或者记录出现次数等
for (int r = 0;r < nums.length;r++){
sum += nums[r];
while (不满足题意){
sum -= nums[l];
l++;
}
res = Math.max(res,r - l + 1);//这里记录答案的位置可能不定
}
System.out.println(res);
}
以力扣题号1004这道题为例
题目:给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。
示例1:
输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2
输出:6
解释:[1,1,1,0,0,1,1,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 6。
提示:
- 1 <= nums.length <= 105
- nums[i] 不是 0 就是 1
- 0 <= k <= nums.length
class Solution {
public int longestOnes(int[] nums, int k) {
int l = 0;
int cnt = 0;
int res = 0;
for(int r = 0;r<nums.length;r++){
if(nums[r] == 0)cnt++;
while(cnt > k){
if(nums[l] == 0)cnt--;
l++;
}
res = Math.max(res,r-l+1);
}
return res;
}
}