【滑动窗口】LeetCode 1004题解 | 最大连续1的个数 Ⅲ

最大连续1的个数 Ⅲ

一、题目链接

最大连续1的个数 Ⅲ

二、题目

三、题目解析

注意题目中说的是最多k次,在一个数组翻转次数是可以 ≤ k的。

四、算法原理

因为翻转操作太复杂,无需翻转。所以可以把本题同等转化为:找0的个数不超过k的最长子数组。

解法一:暴力枚举 + zero计数器

暴力枚举出所有0的个数不超过k的子数组,并用变量zero记录0的个数,时刻更新最长长度。


模拟暴力解法的过程,进而发现优化的地方:

right所指为1,zero不统计,right++

right所指为0,zero+=1,right++

接下来left++,right回退,开始枚举以第二个数开始的符合要求的子数组。发现right停在了一样的位置,再分析发现在蓝色区间内开始枚举的话,right一定会在一样的位置停下,并且zero还会超过限定次数:

综上得出规律1:找到一个结果后,right不用回退,left跳过这一区间。 此时zero为2,right再接着向右枚举。规律2:left向右移动结束后,right继续向右移动。------ 同向双指针

解法二:滑动窗口

五、编写代码

cpp 复制代码
class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int n = nums.size(), left = 0, right = 0, zero = 0, ret = 0;
        while (right < n)
        {
            if (nums[right] == 0) zero++;// 进窗口
            while (zero > k) // 判断
                if (nums[left++] == 0) zero--;// 出窗口
            ret = max(ret, right - left + 1);// 更新结果
            right++;
        }
        return ret;
    }
};

六、时空复杂度

时间复杂度:O(n)

空间复杂度:O(1)

相关推荐
weixin_460443562 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
Cc.Y5 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
启观川5 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸5 小时前
排序算法介绍
python·算法·排序算法
sm_926787055 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev5 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
by209995 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
笔墨登场说说5 小时前
flink bin/start-cluster.sh 帮我做成开机启动
开发语言·python
Sarvartha5 小时前
Lambda 表达式和函数式接口
java·开发语言
小白学大数据6 小时前
拼多多反爬对抗实战:Scrapy 中间件化采集架构解析
开发语言·scrapy·中间件·架构