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;
    }
};
相关推荐
余额瞒着我当琳26 分钟前
C++ map 底层与AVL 树
开发语言·c++·算法
释厄62335 分钟前
物理发展史·量子力学=节点2·牛顿力学=节点3·宇宙的语言算法AI
人工智能·算法·microsoft
CQU_JIAKE1 小时前
9.30【A】
算法
INGNIGHT1 小时前
1897 · 会议室 3(扫描线)
数据结构·算法
All for pursuit.1 小时前
【贪心-2】253.会议室 II
数据结构·c++·算法·leetcode
垆边人似月.1 小时前
华为机考题(一):质数因子
算法·华为
迷途之人不知返2 小时前
算法系列5:位运算
算法
牢姐与蒯2 小时前
c++加餐之位图
c++·算法·哈希
Omics Pro2 小时前
预测性虚拟细胞中显式机理算子
大数据·数据库·人工智能·python·算法·机器学习·自然语言处理
驭渊的小故事2 小时前
算法实战:滑动窗口、素数枚举与字符串模拟(三道经典题解)
java·算法