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值一下,就可以继续向前移动然后判断,重复之前过程即可

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

四.编写代码

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;
    }
};
相关推荐
学习中.........1 小时前
Karpathy nanoGPT 教程到底讲了什么
人工智能·算法·语言模型
城管不管2 小时前
重生——第十次面试之开源中国一面挂
java·linux·开发语言·算法·面试·职场和发展·开源
地平线开发者3 小时前
征程6|YOLOv5x 在 Horizon 征程6 上的端到端部署实践(下)
算法·自动驾驶
speop3 小时前
llm-algo-leetcode |Task01
算法·leetcode·职场和发展
艾为电子3 小时前
【应用方案】电视沉浸式音频升级: 电视音频 awinic“芯片 + 算法” 一体化解决方案
算法·音视频
大熊背3 小时前
树莓派相机自动白平衡详解(二)
算法·白平衡·isppipeline
Scabbards_4 小时前
面试Leetcode - 算法合集
算法·leetcode·面试
chuan.bai4 小时前
Java RAG 实战附录:qwen3 与 bge-m3 模型切换指南
java·人工智能·算法
wuyk5554 小时前
7.AVL 树:第一个自平衡二叉搜索树
开发语言·stm32·单片机·算法