题目

给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k0 ,则返回 数组中连续 1 的最大个数

示例 1:

1
2
3
4
输入: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。

示例 2:

1
2
3
4
输入:nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
输出:10
解释:[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 10。

提示:

  • 1 <= nums.length <= 105
  • nums[i] 不是 0 就是 1
  • 0 <= k <= nums.length

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public int longestOnes(int[] nums, int k) {
int n=nums.length;
int ans=0;
int count=0;// 记录0的个数
for(int left=0,right=0;right<n;right++){
count+=1-nums[right];
while(count>k&&left<=right){
count-=1-nums[left];
left++;
}
ans = Math.max(ans,right-left+1);
}
return ans;
}
}

知识点

题意转换:把「最多可以把 K 个 0 变成 1,求仅包含 1 的最长子数组的长度」转换为 「找出一个最长的子数组,该子数组内最多允许有 K 个 0 」。

求最大连续子区间,可以使用滑动窗口方法。

滑动窗口的限制条件是:窗口内最多有 K 个 0。