10.LeetCode算法习题讲解--滑动窗口--最大连续为一的个数

一.题目

习题链接:1004. 最大连续1的个数 III - 力扣(LeetCode)

二.题目讲解

给定只包含01的数组,最多可以把 k 个 0 变成 1,求:变换之后,最长的连续 1 子数组有多长。

核心:找一段子区间,区间里面0的数量 ≤ k,求这个区间的最大长度。 把区间里最多 k 个 0 翻转成 1,整段就全部是连续 1。

示例 1: nums = [1,1,1,0,0,0,1,1,1,1,0], k=2 允许翻转 2 个 0。 选窗口:[1,1,1,0,0,1],里面有 2 个 0,刚好可以翻转,长度 = 6,就是答案。

注:这里的k是最多能翻多少个,可以不翻也可以翻任意一个只要不超过k就行

三.算法原理讲解

通过读这道题加上理解,我们可以把这道题转化为:寻找一个子数组,里面0的个数不超过给定的k值,这样就可以找到最长的连续子数组了

解法一:暴力枚举

跟之前的思想一样,定着一个数然后不断往后遍历,找到最大的子数组后,让left++,让right拐回来继续重复相同的步骤,可以发现这样做会超时

解法二:滑动窗口

就是在暴力枚举的基础上优化,不让right回来,让它呆在那里,直到子数组中0的个数减少到k值一下,就可以继续向前移动然后判断,重复之前过程即可

图画上个文章已经演示过了这里就不再演示了

四.编写代码

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int left = 0,right = 0, zero = 0,len = 0;
        for(;right < nums.size();right++)
        {
            if(nums[right] == 0)
            {
                zero++;
            }
            while(zero > k)
            {
                if(nums[left] == 0)
                {
                    zero--;
                }
                left++;
            }
            len = max(len,right - left + 1);
        }
        return len;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值