题目链接
最大连续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;}// 可以翻转0if (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;}
}
关键点
- 滑动窗口的思想