33.最长连续子数组

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
例子说明:
可以将输入中的第30和第40变成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
例子说明:
可以将输入中的第30、第40,第50都变成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;
    }
}

posted @   DawnTraveler  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示