当前位置 : 主页 > 编程语言 > java >

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

来源:互联网 收集:自由互联 发布时间:2022-10-26
C++描述 LeetCode 1004. 最大连续1的个数 III   大家好,我叫亓官劼(qí guān jié ) 给定一个由若干 ​​0​​​ 和 ​​1​​​ 组成的数组 ​​A​​​,我们最多可以将 ​​K​​ 个值


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即可​​

    算法实现

    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;
    }
    };


    上一篇:C++描述 LeetCode 1768. 交替合并字符串
    下一篇:没有了
    网友评论