题目链接
最大连续1的个数 III
题目描述
注意点
- nums[i] 不是 0 就是 1
- 0 <= k <= nums.length
解答思路
- 创建一个滑动窗口,保证窗口内翻转0的个数始终不大于k,不断移动窗口的右边界,有以下三种情况:
- 当右边界的值为1,不需要翻转,可以直接移动
- 当右边界的值为0,且此时k的值大于0,可以翻转0,移动的同时需要将k减1
- 当右边界的值为0,且此时k的值为0,不能直接翻转0,需要先移动左边界直到有一个翻转0从窗口中被移除,此时可以移动
代码
class Solution {
public int longestOnes(int[] nums, int k) {
int res = 0;
int left = 0;
for (int right = 0; right < nums.length; right++) {
if (nums[right] == 1) {
res = Math.max(res, right - left + 1);
continue;
}
// 可以翻转0
if (k > 0) {
res = Math.max(res, right - left + 1);
k--;
} else {
// 无法翻转0
// 需要将左边界移动至滑动窗口第一个翻转0处(为right翻转0腾出位置)
while (left <= right && nums[left] == 1) {
left++;
}
left++;
}
}
return res;
}
}
关键点
- 滑动窗口的思想