当前位置: 首页 > news >正文

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

最大连续1的个数 Ⅲ

  • 一、题目链接
  • 二、题目
  • 三、题目解析
  • 四、算法原理
    • 解法一:暴力枚举 + zero计数器
    • 解法二:滑动窗口
  • 五、编写代码
  • 六、时空复杂度

一、题目链接

最大连续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继续向右移动。—— 同向双指针

在这里插入图片描述

解法二:滑动窗口

在这里插入图片描述

五、编写代码

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)

相关文章:

  • IDE 使用技巧与插件推荐
  • 力扣992做题笔记
  • SQL注入——Sqlmap工具使用
  • UA 编译和建模入门教程(zhanzhi学习笔记)
  • LLM最后怎么输出值 解码语言模型:从权重到概率的奥秘
  • 手机怎么查看网络ip地址?安卓/iOS设备查询指南
  • 【QT】类A和类B共用类C
  • python实现pdf转图片(针对每一页)
  • React Contxt详解
  • 【计算机主板架构】ITX架构
  • 企业标准信息公共服务平台已开放标准通编辑器访问入口
  • 苹果的人工智能领域慢热
  • 计算机视觉设计开发工程师学习路线
  • 展锐Android14及更新版本split_build编译方法
  • 【android bluetooth 协议分析 01】【HCI 层介绍 9】【ReadLocalSupportedCommands命令介绍】
  • C语言实现android/linux按键模拟
  • Linux动静态库制作与原理
  • 汇编:电子计数器
  • Linux问题排查-找到偷偷写文件的进程
  • 服务器的基础知识
  • 深圳网站建设公司 犀牛云 移动云网站/网页设计基础
  • 洛阳网站seo/百度seo泛解析代发排名
  • 做个网站怎么做/最新搜索关键词
  • web校园网站开发实验报告/唐山seo排名优化
  • 广东涂料网站建设/杭州seo的优化
  • 简历上作品展示网站链接怎么做/培训行业seo整站优化