LeetCode 1004题:如何找到最大连续1序列,长度可加减?

2026-05-27 23:341阅读0评论SEO资源
  • 内容介绍
  • 相关推荐

本文共计507个文字,预计阅读时间需要3分钟。

LeetCode 1004题:如何找到最大连续1序列,长度可加减?

C++描述:LeetCode 1004. 最大连续1的个数 III,给定一个由0和1组成的数组,最多可以删除K个0,求数组中连续1的最大个数。


C++描述 LeetCode 1004. 最大连续1的个数 III

  大家好,我叫亓官劼(qí guān jié )


给定一个由若干 ​​0​​​ 和 ​​1​​​ 组成的数组 ​​A​​​,我们最多可以将 ​​K​​ 个值从 0 变成 1 。

返回仅包含 1 的最长(连续)子数组的长度。

示例 1:

输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2
输出:6
解释:
[1,1,1,0,0,1,1,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 6。

示例 2:

输入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
输出:10
解释:
[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 10。

提示:

  • ​​1 <= A.length <= 20000​​
  • ​​0 <= K <= A.length​​
  • ​​A[i]​​​ 为​​0​​​ 或​​1​​
  • 解题思路

    滑动窗口。设置左右指针​​l和r​​​分别指向当前区间的左右边界,使用​​lsum记录0-l中0的个数,rsum记录0-r中0的个数​​​,则​​rsum-lsum​​​表示当前区间内0的个数,如果​​rsum - lsum - K <= 0​​​则说明当前区间内都可以转为1,更新​​res​​​,否则​​l右移,更新lsum即可​​

    LeetCode 1004题:如何找到最大连续1序列,长度可加减?

    算法实现

    class Solution {
    public:
    int longestOnes(vector<int>& A, int K) {
    int res = 0, len = A.size();
    // lsum记录0-l中0的个数,rsum记录0-r中0的个数
    int lsum = 0, rsum = 0, l = 0;
    for(int r = 0; r < len ; r++){
    rsum = rsum + 1 - A[r];
    while(rsum - lsum - K > 0){
    // 当前区间有多余的0时,l右移
    lsum = lsum + 1 - A[l++];
    }
    res = max(res,r-l+1);
    }
    return res;
    }
    };


    本文共计507个文字,预计阅读时间需要3分钟。

    LeetCode 1004题:如何找到最大连续1序列,长度可加减?

    C++描述:LeetCode 1004. 最大连续1的个数 III,给定一个由0和1组成的数组,最多可以删除K个0,求数组中连续1的最大个数。


    C++描述 LeetCode 1004. 最大连续1的个数 III

      大家好,我叫亓官劼(qí guān jié )


    给定一个由若干 ​​0​​​ 和 ​​1​​​ 组成的数组 ​​A​​​,我们最多可以将 ​​K​​ 个值从 0 变成 1 。

    返回仅包含 1 的最长(连续)子数组的长度。

    示例 1:

    输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2
    输出:6
    解释:
    [1,1,1,0,0,1,1,1,1,1,1]
    粗体数字从 0 翻转到 1,最长的子数组长度为 6。

    示例 2:

    输入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
    输出:10
    解释:
    [0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
    粗体数字从 0 翻转到 1,最长的子数组长度为 10。

    提示:

  • ​​1 <= A.length <= 20000​​
  • ​​0 <= K <= A.length​​
  • ​​A[i]​​​ 为​​0​​​ 或​​1​​
  • 解题思路

    滑动窗口。设置左右指针​​l和r​​​分别指向当前区间的左右边界,使用​​lsum记录0-l中0的个数,rsum记录0-r中0的个数​​​,则​​rsum-lsum​​​表示当前区间内0的个数,如果​​rsum - lsum - K <= 0​​​则说明当前区间内都可以转为1,更新​​res​​​,否则​​l右移,更新lsum即可​​

    LeetCode 1004题:如何找到最大连续1序列,长度可加减?

    算法实现

    class Solution {
    public:
    int longestOnes(vector<int>& A, int K) {
    int res = 0, len = A.size();
    // lsum记录0-l中0的个数,rsum记录0-r中0的个数
    int lsum = 0, rsum = 0, l = 0;
    for(int r = 0; r < len ; r++){
    rsum = rsum + 1 - A[r];
    while(rsum - lsum - K > 0){
    // 当前区间有多余的0时,l右移
    lsum = lsum + 1 - A[l++];
    }
    res = max(res,r-l+1);
    }
    return res;
    }
    };