问题描述
给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。
解析
很明显的滑动窗口问题,移动右指针的同时确保窗口内只有k个0即可,当0的个数超过之后就移动左指针。
public int longestOnes(int[] nums, int k) {
int maxLen = 0, left = 0, zeros = 0;
for (int right = 0; right < nums.length; right++) {
if (nums[right] == 0) zeros++;
while (zeros > k) {
if (nums[left++] == 0) zeros--;
}
maxLen = Math.max(maxLen, right - left + 1);
}
return maxLen;
}
然后是大佬的异或写法,通过异或操作能够实现0或者1的判断,并且在满足条件(窗口中有大于k个0的时候)的时候将左指针和右指针一起移动,在这种情况下的移动过程中,不一定会保证滑动窗口内的0数量小于等于k,这是一种延迟调整方式。
public int longestOnes(int[] nums, int k) {
int L = 0;
for (int n : nums) {
k -= 1 ^ n;
if (k < 0) {
k += 1 ^ nums[L++];
}
}
return nums.length - L;
}