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

算法题打卡力扣第1004. 最大连续1的个数 III(mid)

文章目录

    • 题目描述
    • 解法一:滑动窗口

题目描述

在这里插入图片描述

解法一:滑动窗口

这道题的题意可以转换为:找到一个最长的子数组,这个子数组里最多包含k个0.

为什么可以这样转换呢?因为题目允许我们把 k 个 0 变成 1。如果我们找到了一个子数组,它里面恰好有 k 个 0,那么我们把这些 0 全都变成 1 之后,整个子数组就都是 1 了。这个子数组的长度,就是我们能得到的连续 1 的长度。
对于这类 “寻找满足某个条件的最长连续子数组” 的问题,滑动窗口 是最常用也是最高效的解法。

滑动窗口的运作方式:

我们可以把滑动窗口想象成一个在数组上移动的 “框框”。这个框框的左边界和右边界由两个指针 left 和 right 来定义。

  • 窗口的扩张 (right 指针移动):
    我们让 right 指针不断地向右移动,把新的元素包含进窗口里。
    每当 right 指针遇到一个 0,我们就记录下来,表示我们使用了一次翻转的机会。
  • 窗口的收缩 (left 指针移动):
    在窗口扩张的过程中,我们可能会遇到窗口内的 0 的数量超过了 k 的情况。
    这个时候,说明当前的窗口已经不满足 “最多包含 k 个 0” 的条件了。为了让窗口重新变得 “合法”,我们必须收缩窗口的左边界。
    我们让 left 指针向右移动。
    如果移出的 nums[left] 恰好是一个 0,那就意味着我们归还了一次翻转的机会。
    left 指针持续向右移动,直到窗口内的 0 的数量再次小于或等于 k,窗口就重新合法了。
  • 记录最大长度:
    在整个过程中(每次 right 指针移动后),窗口的宽度 right - left + 1 都是一个潜在的答案。
    我们只需要在循环中不断更新和维护这个最大宽度即可。

算法步骤拆解

初始化两个指针 left = 0, right = 0。 初始化一个变量 zeros 用来记录当前窗口内 0 的数量,zeros = 0。
初始化一个变量 maxLength 用来记录结果,maxLength = 0。
开始一个循环,让 right 指针从 0 遍历到数组末尾:
a. 将 nums[right] 元素纳入窗口。如果 nums[right] 是 0,则 zeros++。
b. 检查窗口合法性:进入一个while 循环,判断 zeros 是否大于 k。

  • 如果 zeros > k,说明窗口不合法,需要收缩。
  • 检查即将移出窗口的 nums[left]。如果 nums[left] 是 0,则 zeros–(归还了一次机会)。
  • left++,将左边界向右移动。
  • 这个 while 循环会一直执行,直到 zeros <= k,窗口重新合法。
    c. 更新结果:此时的窗口 ([left, right]) 是合法的。我们计算当前窗口的长度 right - left + 1,并更新 maxLength = max(maxLength, right - left + 1)。
    d. right++,继续扩张窗口。
    right 指针遍历完整个数组后,maxLength 就是最终答案。

实现代码

class Solution {
public:int longestOnes(vector<int>& nums, int k) {int n = nums.size();int left = 0,right = 0;int zeros = 0;int maxlength = 0;for(right = 0;right<n;right++){if(nums[right]==0){zeros++;}while(zeros>k){if(nums[left]==0){zeros--;}left++;}int len = right-left+1;maxlength = max(len,maxlength);}return maxlength;}
};

执行结果:
在这里插入图片描述
复杂度分析:
时间复杂度:O(n)
空间复杂度:O(1)

http://www.dtcms.com/a/356621.html

相关文章:

  • useEffect用法
  • Git 版本管理核心实践与问题解决手册
  • 群晖Nas上使用工具rsync工具usb同步数据
  • 计算机视觉与深度学习 | 视觉里程计技术全景解析:从原理到前沿应用
  • cloudflare-ddns
  • 过滤器和拦截器的区别?
  • 企业内网与互联网网络安全改造升级深度解析
  • Elasticsearch AI 语义搜索(semantic_text)
  • eslasticsearch+ik分词器+kibana
  • Linux系统部署:Certbot 实现 Nginx 自动续期部署 Let‘s Encrypt 免费 SSL 证书
  • matlab矩阵生成stl格式文件,适用于多孔介质图形生成
  • IAR工程如何生成compile_commands.json文件(能生成但是clangd不能生成“.cache文件”)
  • Spark算子调优
  • AAA服务器
  • Mock 在 API 研发中的痛点、价值与进化及Apipost解决方案最佳实践
  • 3.1 DataStream API 编程模型
  • YARN架构解析:深入理解Hadoop资源管理核心
  • Ubuntu 服务器 KERNEL PANIC 修复实录
  • Java-面试八股文-Mysql篇
  • 【前端教程】从性别统计类推年龄功能——表单交互与数据处理进阶
  • IDEA之GO语言开发
  • cssword属性
  • 深度拆解 OpenHarmony 位置服务子系统:从 GNSS 到分布式协同定位的全链路实战
  • 20250829_SQLserver数据库_Server ip10.5.7.44在客户端用Navicat创建一个WATDB_ANDON数据库下的只读用户
  • 【小白笔记】Visual Studio 在 2025年7月更新的功能说明(英文单词记忆)
  • 软考 系统架构设计师系列知识点之杂项集萃(135)
  • TF-IDF:文本分析的“火眼金睛”
  • 绿幕电商直播为什么要用专业抠图软件.
  • 新手向:从零开始理解百度语音识别API的Python实现
  • CLion 中配置运行 Qt 项目指南