给定一个由若干 0 和 1 组成的数组以及整数n,我们最多可以将 n 个值从 0 变成 1或从1变成0 ,返回仅包含 1或0 的最长(连续)子数组的长度
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M
示例1
输入例子:
[1,1,1,0,0,0,1,1,1,1,0],2
输出例子:
6
解析:这是一个典型的滑动窗口问题,我们可以使用双指针的方法来解决。首先定义两个指针left和right,分别表示子数组的左右边界。然后遍历数组,当遇到0时,将right指针向右移动一位;当遇到1时,将left指针向右移动一位,同时更新最大长度。最后返回最大长度。
代码如下:
public int longestSubarray(int[] nums, int n) {
int left = 0, right = 0;
int maxLength = 0;
int zeroCount = 0;
while (right < nums.length) {
if (nums[right] == 0) {
zeroCount++;
}
while (zeroCount > n) {
if (nums[left] == 0) {
zeroCount--;
}
left++;
}
maxLength = Math.max(maxLength, right - left + 1);
right++;
}
return maxLength;
}