1.题目描述
给定一个二进制数组
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。示例 2:
输入: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
2.解题思路
思路同 考试的最大困扰度 相同,使用变长滑动窗口,窗口左指针移动的条件是:窗口中0的个数已经超过了k个,就说明无法再通过翻转0使得窗口内全是1了,必须要移除掉超出的0,使用res记录遍历过程中最大的窗口大小,即为最大连续1的个数。
3.代码实现
class Solution {
public int longestOnes(int[] nums, int k) {
int cnt = 0;
int res = 0;
int l = 0;
for (int r = 0; r < nums.length; r++) {
if (nums[r] == 0) {
cnt += 1;
}
while (cnt > k) {
if (nums[l] == 0) {
cnt -= 1;
}
l += 1;
}
res = Math.max(res, r - l + 1);
}
return res;
}
}