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

[优选算法专题二滑动窗口——最大连续1的个数 III]

题目链接

最大连续1的个数 III

题目描述

题目解析

问题本质

  • 输入:二进制数组nums(只包含 0 和 1)和整数k
  • 操作:最多可以将k个 0 翻转成 1
  • 目标:找到翻转后能得到的最长连续 1 的子数组长度

这个问题的核心是要找到一个区间,在允许翻转最多k个 0 的情况下,这个区间内的 1(包括翻转得到的 1)是最长的。

解题思路:滑动窗口法

滑动窗口(双指针)是解决这类 "最长连续子数组" 问题的高效方法,基本思想是:

  1. 用两个指针leftright维护一个区间(窗口)[left, right]
  2. 保证窗口内的 0 的数量不超过k(即可以通过翻转使整个窗口都变为 1)
  3. 不断扩大窗口(移动right),当窗口不满足条件时缩小窗口(移动left
  4. 记录过程中出现的最大窗口长度

算法流程:

1.  初始化: left = 0 , right = 0 , ret = 0 ;

2.  当 right ⼩于数组⼤⼩的时候,⼀直下列循环:

     i:进窗口,1无视,0计数表++;

     ii:判断计数表是否 >k;

          是则让左侧元素滑出窗⼝,更新哈希表的值,直到 0 的个数恢复正常;

     iii:更新结果,right++;

3.  循环结束后, ret 存的就是最终结果。

关键代码逻辑解析

// 当窗口中0的数量超过k时,需要缩小窗口
while(zero > k) {if(nums[left++] == 0) zero--;
}

这段代码是算法的核心,它确保了窗口的合法性:

  • 当 0 的数量超过 k 时,通过移动左指针缩小窗口
  • 只有当移除的元素是 0 时,才减少zero的计数
  • 循环结束后,窗口内 0 的数量一定≤k
ret = max(ret, right - left + 1);

这行代码用于更新最长有效窗口的长度,每次移动右指针后都要检查当前窗口是否是最长的。

完整代码

算法优势分析

  1. 时间效率

    • 每个元素最多被leftright各访问一次
    • 总时间复杂度为 O (n),n 为数组长度
    • 相比暴力解法(尝试所有可能的子数组)的 O (n²) 有显著提升
  2. 空间效率

    • 只使用了常数个额外变量(leftrightzeroret等)
    • 空间复杂度为 O (1)
http://www.xdnf.cn/news/1311931.html

相关文章:

  • huggingface TRL中是怎么获取参考模型的输出的
  • Swift 实战:实现一个简化版的 Twitter(LeetCode 355)
  • 新手向:GitCode疑难问题诊疗
  • Java 10 新特性及具体应用
  • 嵌入式硬件篇---电感串并联
  • 2^{-53} 单位舍入误差、机器精度、舍入的最大相对误差界限
  • 实例分割-动手学计算机视觉13
  • docker安装mongodb及java连接实战
  • Effective C++ 条款45:运用成员函数模板接受所有兼容类型
  • Linux怎么查看服务器开放和启用的端口
  • 【原理】C# 字段、属性对比及其底层实现
  • illustrator插件大全 免费插件介绍 Ai设计插件集合 (3)
  • Python语言一键整理xhs评论 基于github的开源项目 MediaCrawler
  • Linux进程概念(四)环境地址变量
  • 同创物流学习记录2·电车
  • 链式二叉树的基本操作——遍历
  • 实时计算 记录
  • 美国服务器环境下Windows容器工作负载基于指标的自动扩缩
  • 从盲区到全域:黎阳之光视频孪生+AI智能算法驱动智慧机场三维感知革命
  • 4.6 Vue 3 中的模板引用 (Template Refs)
  • CSS复习
  • Jenkins安装部署(Win11)和常见配置镜像加速
  • SysTick寄存器(嘀嗒定时器实现延时)
  • 要导入StandardScaler类进行数据标准化,请使用以下语句:
  • VS Code配置MinGW64编译ALGLIB库
  • 《C语言程序设计》笔记p10
  • 【数据分享】上市公司供应链成本分摊数据(2007-2024)
  • 【数据结构】-2- 泛型
  • leetcodehot100 矩阵置零
  • 基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统