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

一.题目

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

二.题目讲解

给定只包含0和1的数组,最多可以把 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值一下,就可以继续向前移动然后判断,重复之前过程即可

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

四.编写代码

cpp 复制代码
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;
    }
};
相关推荐
小雉系统5 小时前
BcoreOS安全通信架构:FsSession 抗算法后门安全设计
算法·安全·架构
唐墨12310 小时前
linux kernel 比较数据大小的宏定义
linux·算法
拂拉氏10 小时前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口
lsc_blog13 小时前
听到优化风声,先准备能由自己掌控的事
数据库·分布式·中间件·职场和发展·重构
通信小呆呆15 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
笑容掩饰我的失落15 小时前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
Severus_black15 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
2601_9679791218 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程
程序猿打工仔18 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法