最大连续 1 的个数
目录
一:题目链接
二:题目思路
解法一:
解法二:
三:代码实现
一:题目链接
题目理解需要注意的是,最多可以翻转 k 个 0 ,指的是 不一定 就要翻转 k 个 0,只要翻转的 0 不超过 k 个,能找到最大连续 1 的个数就是最终结果。
二:题目思路
解法一:
首先,我们最先想到的就是使用 暴力枚举 ,定义 left 和 right 指针在数组起始位置,定义 len 记录最大连续 1 的个数,可以加入一个记录翻转 0 次数的计数器 ,left 先固定一个数,right 指针往后走,遇到 0 计数器加一,过程中直到 计数器等于 k ,len 记录此时最大连续1 的个数,left ++ 枚举另一个数,right 回到 left 位置继续往后重复执行上述操作。
此思路我们可以优化一下。
解法二:
定义 left 和 right 指针在数组起始位置,定义 len 记录最大连续 1 的个数,可以加入一个记录翻转 0 次数的计数器 a ,left 先固定一个数,right 指针往后走,遇到 0 计数器加一,过程不断记录新的 len ,过程中遇到计数器等于 k,right 继续++,此时情况如图:
接下来,计数器 a 为 3,我们就要移动 left 了,应该怎么移动呢?答案是移动 left 到第二个 0 的位置,为什么?因为 right 的位置已经走过 2 个 0 了,加上 right 位置的 0 就有三个 0 了,那么 right 前面的数字最多只能到 right 的位置,所以,我们可以 使用判断条件,如果 left 移动到的位置是 1 ,就继续 left ++ ,如果 left 移动到的位置是 0 ,那么 a --,此时 a 为 2了,right 指针可以继续往后走,直到遇到 0 计数器加一,直到 a 又为 3 了,此时,移动 left ,不断维护 a <= k + 1 的判断条件,直到 right 到达数组末尾结束。
三:代码实现
//记录翻转 0 的个数int a = 0;//记录连续 1 的个数int len = 0;int left = 0;int n = nums.length;for(int right = 0;right < n; right++) {//进窗口if(nums[right] == 0) {a++;}while(a > k) {if(nums[left] == 0) {a--;}left++;}len = Math.max(len,right - left + 1);}return len;