当前位置: 首页 > 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)

http://www.xdnf.cn/news/522379.html

相关文章:

  • 小程序弹出层/抽屉封装 (抖音小程序)
  • CSS- 4.6 radiu、shadow、animation动画
  • CVE-2015-4553 Dedecms远程写文件
  • prisma连接非关系型数据库mongodb并简单使用
  • 【QT】类A和类B共用类C
  • 分布式数据库TiDB:深度解析原理、优化与架构设计
  • 永磁同步电机高性能控制算法(22)——基于神经网络的转矩脉动抑制算法为什么低速时的转速波动大?
  • 批量剪辑 + 矩阵分发 + 数字人分身源码搭建全技术解析,支持OEM
  • 【NLP】37. NLP中的众包
  • VR 互动实训与展示,借科技开启沉浸式体验新篇​
  • 【内测征集】LarkVR 播控系统上新:VR 应用一站式专业播控与管理工具
  • 基于CATIA参数化圆锥建模的自动化插件开发实践——NX建模之圆锥体命令的参考与移植(一)
  • Python函数——万字详解
  • Windows 安装显卡驱动
  • Linux云计算训练营笔记day11(Linux CentOS7)
  • esp32课设记录(五)整个项目开源github
  • 用Python将 PDF 中的表格提取为 Excel/CSV
  • 腾讯云安装halo博客
  • 游戏引擎学习第294天:增加手套
  • LeetCode 217.存在重复元素
  • 大语言模型训练数据格式:Alpaca 和 ShareGPT
  • 将视频中的音乐传到qq音乐上听
  • DS新论文解读(2)
  • HashMap的扩容机制
  • Vue环境下数据导出Excel的全面指南
  • 一:操作系统之系统调用
  • 【应用开发十】pwm
  • numpy数组的拆分和组合
  • 【Linux服务器】-虚拟机安装(CentOS7.9)
  • 我的世界模组开发——方块(2)