最大连续1的个数
1.题目链接
1004. 最大连续1的个数 III
2.原题描述:
给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数
3.相关算法
滑动窗口:使用滑动窗口维护一个区间,使得区间内的 0 的数量不超过 k。具体地,右端点不断向右移动,如果遇到了 0,那么就尝试将左端点右移,直到区间内的 0 的数量不超过 k。在每次移动右端点时,都需要更新最大连续 1 的个数。
4.本题主要思路
本题主要是要将问题转化,题目求是可以翻转k个0,那么我们就可以转化成可以允许最多有k个0在该连续的区间内,那么可以使用滑动窗口维护一个区间,使得区间内的 0 的数量不超过 k。当该区间的0超过相对应的数量时,滑动窗口往后移动,并且判断最左边的是否是0,如果是0,那么zerocount-1。继续按照前面的方式继续,直到右端到达数组的尾部。
5.源码分析
class Solution {
public int longestOnes(int[] nums, int k) {
int left = 0, right = 0, zeroCount = 0, maxCount = 0; // 1
while (right < nums.length) {
if (nums[right] == 0) { // 2
zeroCount++;
}
while (zeroCount > k) {
if (nums[left] == 0) { // 3
zeroCount--;
}
left++;
}
maxCount = Math.max(maxCount, right - left + 1); // 4
right++; // 5
}
return maxCount; // 6
}
}
- 创建并初始化左右边界的变量,以及该区间内0的个数的计数器,还有最大连续的数量;
- 滑动窗口往前滑动,判断该位置的数是否为0,若为0则zerocount++;
- 当0的数量大于要求的数量,滑动窗口的左端往前移动并判断最左端位置的数是否为0,若为零zerocount-1;
- 判断此时区间的区间值是否为最大,若大于原来的最大值则将其替换
- 滑动窗口继续往前滑动
- 滑动窗口到达数组末尾,程序结束,返回最大的连续数;