• leetcode 1004最大连续1的个数


    给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 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。
    输入: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. 1 <= A.length <= 20000
    2. 0 <= K <= A.length
    3. A[i] 为 0 或 1 

    方法一:二分

      因为0的个数是依此递增的,所以我们可以枚举区间i,j这个区间内0的个数要小于K

    class Solution {
    public:
        int cnt[20000+10];
        int longestOnes(vector<int>& A, int K) {
            for (int i=1;i<=(int)A.size();++i){
                cnt[i]=cnt[i-1]+(A[i-1]==0);
            }
            int res=0;
            for (int i=1;i<=(int)A.size();++i){
                int l=i,r=(int)A.size(),ans=0;
                while (l<=r){
                    int mid=l+((r-l)>>1);
                    if (cnt[mid]-cnt[i-1]<=K){
                        l=mid+1;
                        ans=mid-i+1;
                    }
                    else r=mid-1;
                }
                res=max(res,ans);
            }
            return res;
        }
    };

    方法二:双指针

    class Solution {
    public:
        int longestOnes(vector<int>& A, int K) {
            int l=0,r=0,ans=0,change=0;
            for(int i=0;i<A.size();i++){
                if(A[i]==0){
                    if(change<K){
                        change++;
                        r++;
                    }
                    else{
                        while(l<=r&&A[l]!=0)
                            l++;
                        l++;
                        r++;
                    }
                }
                else
                    r++;
                ans=max(ans,r-l);
            }
            return ans;
        }
    };
  • 相关阅读:
    sicily 山海经 线段树实例
    常用位运算
    广度优先搜索有环图
    线性O(N)时间复杂度求素数 , 筛法
    sicily2014
    机器学习中相似性度量(转载)
    VS2010中Parallel的使用
    CKeditor与Asp.net验证控件的问题
    将div一直保持到页面底部
    利用DataAnnotations验证实体(类)的属性
  • 原文地址:https://www.cnblogs.com/flightless/p/10466185.html
Copyright © 2020-2023  润新知