leetcode 1004. 最大连续1的个数 III(滑动窗口)

1004. 最大连续1的个数 III

给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。返回仅包含 1 的最长(连续)子数组的长度。

分析:

  • 目的就是求一个最大的窗口,这个窗口中的所有的值都是1,但是其实是由部分1和部分0构成的
  • 最终的窗口的大小应该是一些1和K个0构成的
  • 所以如何当前窗口的1的个数加上0的个数是小于当前的1的个数加上k,那么就将窗口进行往右扩充,否则左指针移动,收缩窗口
class Solution {
public:
    int longestOnes(vector<int>& A, int K) { 
        int l = 0;
        int r = 0;
        int cnt_zero = 0;
        int res = 0;
        //i表示的就是右指针
        while(r<A.size()){
            if(A[r]==0) cnt_zero++;        
            while(cnt_zero>K){
                if(A[l]==0) cnt_zero--;
                l++;
            }
            //什么情况下进行计算res, 就是l和r正好都在合法窗口的边界的时候,前面的这个while相当于是一个过滤的作用
            res = max(res, r-l+1);//r表示的是满足条件的窗口的右边
            r++;
        }
        return res;
    }
};

424. 替换后的最长重复字符

给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
注意:
字符串长度 和 k 不会超过 104。
示例 1:
输入:
s = “ABAB”, k = 2
输出:
4
解释:
用两个’A’替换为两个’B’,反之亦然。
分析:
和上一题不同的是,上一题是包含有两个字符,即字符1 和字符0,本题包含多个字符,那么相对于上一题的字符1的话,就是要统计当前的字符的评率最大的字符。

class Solution {
public:
    int characterReplacement(string s, int k) {
        int r = 0;
        int l = 0;
        //使用一个26长的整型数组进行存储每个字符串的个数
        vector<int> times(26);
        int res = 0;
        while(r<s.size()){
            //当前窗口统计当前最大的重复字符的个数
            times[s[r]-'A']++;
            int max_v = 0;
            max_v = *max_element(times.begin(), times.end());
            int len = r-l+1;
            while((len-max_v)>k){
                if(times[s[l]-'A']>0) times[s[l]-'A']-=1;
                l++;
                len = r-l+1;
            }
            res = max(res, r-l+1);
            r++;
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值