当前位置: 首页 > 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.xdnf.cn/news/1388917.html

相关文章:

  • 技术速递|新手指南:如何在 Foundry Local 中使用自定义模型
  • 百度后端岗位--面试真题分析
  • CCS的诡异报错合集1(以C2000为例)
  • MAC spotlight 搜不到应用程序和 tags 生效
  • ZooKeeper 安装配置
  • C++基础(②VS2022创建项目)
  • 球型摄像机实现360°无死角
  • CLion 中配置运行 Qt 项目指南
  • 三一重工AI预测性维护破局:非计划停机减少60%,技师转型与数字孪生技术搅动制造业
  • 预制菜餐厅:工业化与温度餐平衡术
  • 【Rust】 5. Trait 与运算符重载
  • Python Imaging Library (PIL) 全面指南:PIL高级图像处理-分割与颜色空间转换
  • [Mysql数据库] 知识点总结6
  • 人工智能-python-深度学习-批量标准化与模型保存加载详解
  • 嵌入式-定时器的从模式控制器、PWM参数测量实验-Day24
  • 快手发布SeamlessFlow框架:完全解耦Trainer与Agent,时空复用实现无空泡的工业级RL训练!
  • OpenTenBase实战:从MySQL迁移到分布式HTAP的那些坑与收获
  • MySQL數據庫開發教學(三) 子查詢、基礎SQL注入
  • java开发连接websocket接口
  • system论文阅读--HPCA25
  • 基于SpringBoot和百度人脸识别API开发的保安门禁系统
  • LubanCat-RK3568 UART串口通信,以及遇到bug笔记
  • 实时音视频延迟优化指南:从原理到实践
  • Less运算
  • (一)Python语法基础(上)
  • C++中float与double的区别和联系
  • 基于STM32设计的智能宠物喂养系统(华为云IOT)_273
  • 迅为RK3588开发板安卓串口RS485App开发-硬件连接
  • 智慧工地源码
  • 如何将iPhone日历传输到电脑