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

力扣-最大连续一的个数

1.题目描述

2.题目链接

1004. 最大连续1的个数 III - 力扣(LeetCode) 

3.代码解答

class Solution {public int longestOnes(int[] nums, int k) {int zero=0,length=0;for(int left=0,right=0;right<nums.length;right++){if(nums[right]==0){zero++;}while(zero>k){if(nums[left]==0){zero--;}left++;}length=Math.max(length,right-left+1);}return length;}
}

 4.解题思路

题目要求将最多k个0反转,也就是最多将k个0全部变为1,求数组中最长的全是1的子串

我们先定义两个指针left和right,让他们都指向数组中的首元素。数组如下例子:

这时k=2,也就是说,我们最多可以将2个0反转为1,我们可以将第四个和第五个0反转为1,这时的连续1的个数就是5,或者将倒数第1个和第2个0反转,这时连续1的个数就是6。

我们先让left保持不动让right指针从前往后遍历数组,再定义一个zero计数器,用来计算right到left之间子串的0的个数

当zero>k时right指针停止移动

 

这时right之前的子串就是我们要求的子串。 

那么下一个子串如何寻找?right还需要往后遍历吗?

right不需要往后遍历了,因为只要子串的起始元素是left,那么现在right指向的0就已经超过题目要求的k个0的要求了

那么left怎么移动?一个一个遍历数组吗?

当然不必,因为括号部分的0已经超过了题目中要求的最多k个0,left指针只要指向括号0部分之前,right结束位置都不会变。

那么left应该怎么移动呢?

left不用回退,保持自增,每略过一个0就使zero计数器-1,直到zero<=k,这时才又重新满足要求。也就是如下位置: 

 

而right也不必回退,因为此时right到left之间的子串已经合法了(zero<=k),所以right继续遍历数组即可。

我们不断更新length的值,直到right遍历完数组,返回最后保留下来的length即可。

所以我们发现,在整个过程中,left和right都不回退,而是一直保持同向移动,这也是我们非常熟悉的滑动窗口了。

  1. 滑动窗口逻辑
    • 右指针扩展窗口,遇到 0 时增加 zero 计数
    • 当 zero 超过 k 时,左指针右移以收缩窗口
    • 窗口合法时,记录当前窗口长度

5.代码细节

这里可以用while吗?

 if(nums[right]==0){zero++;}

当然不可以,因为如果使用while,当right指针碰上while时,while循环永远无法结束,zero会一直自增,直至超出内存限制。

这里if处理右指针遇到的单个 0(扩展窗口)。

那为什么这里可以用while?

while(zero>k){if(nums[left]==0){zero--;}left++;}

需要持续收缩窗口,直到窗口重新合法(可能需要移除多个 0)。 

因为while中left一直在自增,那么right到left之间的子串中包含的0的个数也就总会减少,直到zero<=k,while循环自然也就结束了。

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

相关文章:

  • == 和 equals 的区别
  • 汽车充电桩专用ASCP210系列电气防火限流式保护器
  • 2025年河北省职业院校技能大赛“网络空间安全技能大赛”赛项样题A
  • 软考 UML中的 用例图 的泛化 包含 扩展 关系
  • 院校机试刷题第九天:P1042乒乓球、回顾代码随想录第二天
  • NBA足球赛事直播源码体育直播M35模板赛事源码
  • 智能办公协同系统开发日志(三):画板模块设计与实现全记录
  • windows 删除文件夹提示“操作无法完成,因为其中的文件夹或文件已在另一程序中打开”
  • Git命令汇总(自用,持续更新update 5/23)
  • Python绘制新冠疫情的知识图谱
  • 一次Java Full GC 的排查
  • Python应用“关键字”初解
  • C++学习:六个月从基础到就业——多线程编程:线程池实现
  • 101个α因子#25
  • 6.12.有向无环图描述表达式
  • 《洞察因果本质:解锁智能体大模型精准预测的底层逻辑》
  • Java原子类的实现原理 CAS的使用以及缺陷
  • Python unittest
  • Windows逆向工程提升之IMAGE_SECTION_HEADER
  • 解决androidstudio不能识别夜神模拟器的问题
  • 前端 git仓库
  • 蜂鸣器模块
  • Java单例模式终极指南:从原理到防御性编程
  • 在线教育系统源码开发新趋势:白板教学、多端适配与智能组卷机制解读
  • CESM 运行环境搭建实战:Linux 基础、编译体系与 Machine File 配置
  • Java-System工具类深度解析
  • Elabscience CD161/NK1.1 抗体 [PK136]:肿瘤免疫与 NK 细胞活化研究新工具!
  • 灰度矫正算法详解【Halcon】:线性光照不均的处理方法【附代码下载】
  • DAY33
  • CRichEditCtrl 控件实现日志输出