33.最长连续子数组

发布时间 2023-12-20 23:14:22作者: DawnTraveler

1.题目介绍

33.最长连续子数组
给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 ,返回仅包含 1 的最长(连续)子数组的长度
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512

示例1
输入例子:
[1,1,1,0,0,0,1,1,1,1,0],2
输出例子:
6
例子说明:
可以将输入中的第3个0和第4个0变成1,新数组为[1,1,1,0,0,1,1,1,1,1,1],因此最长连续1的子数组长度为6
示例2
输入例子:
[0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1],3
输出例子:
10
例子说明:
可以将输入中的第3个0、第4个0,第5个0都变成1,新数组为[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1],因此最长连续1的子数组长度为10

2.题解

2.1 滑动窗口

思路

这里使用标记记录zero的个数,若为超过zero最大个数,即可向后拓展窗口,直到超过最大个数。
这时候将窗口左端向左移动,直到将一个0排除窗口,将标记个数减一,继续拓展窗口。

代码

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param arr int整型一维数组
     * @param k int整型 允许0变为1的个数
     * @return int整型
     */
    public int GetMaxConsecutiveOnes(int[] arr, int k) {
        int left = 0;
        int zeroNum = 0;
        int ans = 0;
        for (int right = 0; right < arr.length; right++){
            if (arr[right] == 0) zeroNum++;
            while (zeroNum > k){
                if (arr[left] == 0) zeroNum--;
                left++;
            }
            ans = Math.max(ans,right - left + 1);
        }
        return ans;
    }
}