力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目描述
给定一个二进制数组 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。
解题思路
因为可以翻转最多k个0,所以我们可以将题目转换成:找出最长的子数组,子数组中0的个数不超过k个
暴力枚举+0计数器
枚举所有情况,每种情况当0计数器大于k的时候停止
优化
还是利用滑动窗口来解决问题
1.定义left,right指针,初始都为0,然后固定left,right向右移动,移动时right指向的数如果是1,则什么都不管,如果是0,则zero计数器加一
2.当zero计数器大于k的时候,此时right不动,left向右移动到合适的位置,直到left越过一个0,同时zero计数器减一,直到zero小于k,再重复第1步
3.每当left固定一次,都要判断当前窗口的长度,如果增大则更新len,直到right超过数组的长度
代码
public int longestOnes(int[] nums, int k) {
int zero = 0;
int left = 0;
int right = 0;
int len = 0;
//当right<nums.length 时,进入循环
while (right < nums.length){
//right向右移动,遇到0,zero++
if (nums[right] == 0){
zero++;
}
right++;
//zero等于k之后移动left,每次跳过若干1和一个0
while(zero>k){
if (nums[left] == 0){
zero--;
}
left++;
}
if (len<(right-left)){
len = right-left;
}
}
return len;
}