Leetcode - 485. 最大连续 1 的个数

news2024/11/17 11:34:08

与其后悔与抱怨,不如从现在改变

在这里插入图片描述

485. 最大连续 1 的个数 - Easy

给定一个二进制数组 nums , 计算其中最大连续 1 的个数。

示例 1:

输入:nums = [1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.

示例2:

输入:nums = [1,0,1,1,0,1] 输出:2

提示:

  • 1 <= nums.length <= 105
  • nums[i] 不是 0 就是 1.

此题被标注为Easy类别,但是初看此题,还是不太容易一次性做对,遂有此文。


1. 解读题目

题目关键点:

  1. 二进制数组( 即:num[i] 非 0 即 1 )
  2. 最大连续1的个数

2. 解法1

2.1 错误解法
class Solution {
    public int findMaxConsecutiveOnes(int[] nums) {
		// 1. 处理边界条件
		if(nums == null || nums.length == 0) return 0;
		
		int result = 0;
		// 记录遍历过程中连续1的数量
		int amountOfOne = 0;

		for(int i = 0;i < nums.length; i++){
			if(nums[i] == 1){
				amountOfOne += 1;
			}else{
				result = Math.max(result, amountOfOne);
				amountOfOne = 0;
			}
		}
		return result;
    }
}

刚开始解答此题的时候,容易写成上述代码,但是很遗憾 —— 为山九仞,功亏一篑!!!
如果在面试中,写成这样,甚是可惜。

我们来分析一下原因:
在这里插入图片描述
通过上述图示的两种情况,我们会发现上述解法的问题,就是如果数组最后一位为1,最大连续1的结果可能出现在数组的后半段,结果有误,原因在于我们没有进行result的更新操作。

2.2 正确解法
class Solution {
    public int findMaxConsecutiveOnes(int[] nums) {
		// 1. 处理边界条件
		if(nums == null || nums.length == 0) return 0;
		
		int result = 0;
		// 记录遍历过程中连续1的数量
		int amountOfOne = 0;

		for(int i = 0;i < nums.length; i++){
			if(nums[i] == 1){
				amountOfOne += 1;
			}else{
				result = Math.max(result, amountOfOne);
				amountOfOne = 0;
			}
		}
		// 我们在最后进行result的更新,这样结果就正确啦。但是我们发现有重复代码可以优化
		result = Math.max(result, amountOfOne);
		return result;
    }
}
2.2.1 正确解法-1(优化代码)
class Solution {
    public int findMaxConsecutiveOnes(int[] nums) {
		// 1. 处理边界条件
		if(nums == null || nums.length == 0) return 0;
		
		int result = 0;
		// 记录遍历过程中连续1的数量
		int amountOfOne = 0;

		for(int i = 0;i < nums.length; i++){
			if(nums[i] == 1){
				amountOfOne += 1;
			}else{
				amountOfOne = 0;
			}
		   // 无论nums[i] 是否为1,我们都进行更新result,似乎有点暴力
			result = Math.max(result, amountOfOne);
		}
		return result;
    }
}
2.2.2 正确解法-2(优化代码)
class Solution {
    public int findMaxConsecutiveOnes(int[] nums) {
		// 1. 处理边界条件
		if(nums == null || nums.length == 0) return 0;
		
		int result = 0;
		// 记录遍历过程中连续1的数量
		int amountOfOne = 0;

		for(int i = 0;i < nums.length; i++){
			if(nums[i] == 1){
				amountOfOne += 1;
				// 我们分析可以发现,只有在nums[i] = 1时,才有更新的意义
				result = Math.max(result, amountOfOne);
			}else{
				amountOfOne = 0;
			}
		}
		return result;
    }
}

在这里插入图片描述

3. 解法2 - (双指针or滑动窗口)

在这里插入图片描述

 public int findMaxConsecutiveOnes(int[] nums) {
        // 1. 处理边界条件
		if(nums == null || nums.length == 0) return 0;
		
		int result = 0;
		int left = 0;
		int right = 0;

		while(right < nums.length){
			if(nums[right] == 1){
				right++;
			}else{
				right++;
				left = right;
			}
			result = Math.max(result,right-left);
		}
		return result;
    }
3.1 优化-1
 public int findMaxConsecutiveOnes(int[] nums) {
        // 1. 处理边界条件
		if(nums == null || nums.length == 0) return 0;
		
		int result = 0;
		int left = 0;
		int right = 0;

		while(right < nums.length){
			if(nums[right] == 1){
				right++;
				// 只在nums[i]== 1的场景下,进行比对更新result
				result = Math.max(result,right-left);
			}else{
				right++;
				left = right;
			}
		}
		return result;
    }
3.2 写法优化-2

写法上的优化:即将right++ 收敛到判断条件中

 public int findMaxConsecutiveOnes(int[] nums) {
        // 1. 处理边界条件
		if(nums == null || nums.length == 0) return 0;
		
		int result = 0;
		int left = 0;
		int right = 0;

		while(right < nums.length){
			if(nums[right++] == 1){
				result = Math.max(result,right-left);
			}else{
				left = right;
			}
		}
		return result;
    }
3.3 性能优化-3

性能上的优化: 原因在于题目要求是最大连续1的个数,所以给的测试用例中0为少数,而1的数量比较多。

我们在nums[i]=0的场景下进行比对的数量将远远小于nums[i]=1的场景。

 public int findMaxConsecutiveOnes(int[] nums) {
        // 1. 处理边界条件
		if(nums == null || nums.length == 0) return 0;
		
		int result = 0;
		int left = 0;
		int right = 0;

		while(right < nums.length){
			if(nums[right] == 1){
			 	right++;	
			}else{
				result = Math.max(result,right-left);
				right++;
				left = right;
			}
		}
		result = Math.max(result,right-left);
		return result;
    }

先讲到这里。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/125662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

原油期货在哪里交易?美原油期货和布伦特原油期货选择哪个交易更好?

石油是与人类社会及经济息息相关的能源&#xff0c;从工业生产、交通运输&#xff0c;以至制造塑胶产品、化妆品及衣服纤维等&#xff0c;无孔不入地渗透我们的日常生活与工商业活动。石油经开采后&#xff0c;未经加工的状态通称为原油&#xff0c;既是不可或缺的能源&#xf…

新茶饮 200+ 门店优化库存成本,需要几个数据分析师?

小 L 是一家茶饮门店的店长&#xff0c;她所在的新茶饮企业已经在全国布局了超过 200 家实体门店。小 L 每周除了整理 Excel 数据向区域总监汇报外&#xff0c;还要抽时间站到柜台前&#xff0c;完成总部要求的“在前线做决策”。虽然忙碌&#xff0c;但还能 Hold 得住&#xf…

云图联动创宇智脑,打造高价值威胁情报赋能的威胁处置闭环与攻击溯源

网络对抗日趋激烈&#xff0c;《关基保护要求》提出更高检测防御要求&#xff0c;高级威胁检测面对需求升级&#xff0c;知道创宇推出创宇云图与创宇威胁情报网关、创宇智脑威胁情报平台联防联控方案&#xff0c;打破单个网络安全产品的孤岛&#xff0c;充分发挥产品联动方案的…

数据结构(2)—算法

&#xff08;1&#xff09;小白建议学习青岛大学王卓老师的数据结构视频&#xff0c;或者购买程杰老师的大话数据结构。 &#xff08;2&#xff09;邀请加入嵌入式社区&#xff0c;您可以在上面发布问题&#xff0c;博客链接&#xff0c;公众号分享&#xff0c;行业消息&#x…

【SpringMVC】数据格式化+数据验证

目录 一、前言 二、目录结构 三、数据格式化 四、数据验证 五、数据格式化、验证梳理图 六、数据格式化、验证梳理图 相关文章 【SpringMVC】入门篇&#xff1a;带你了解SpringMVC的执行流程【SpringMVC】入门篇&#xff1a;带你了解SpringMVC的执行流程 【SpringMVC】使用篇&a…

ref的使用方法 ,组件通信父传子,组件通信子传父,组件分离模块化, v-model 传值的3种方式

原生获取一个节点&#xff1a;document.getElementById() vue方式操作dom节点&#xff1a;ref 通过给元素设定ref属性在vue实例中获取这个元素: <input type"text" ref"input" placeholder"请输入内容"> 组件挂载后(mounted)才能访问…

【重要】有三AI技术专栏作者邀请,5大权益助力共同成长

知识分享平台众多&#xff0c;我们有三AI公众号是其中一个&#xff0c;在过去的3年里&#xff0c;我们已经写了700多篇&#xff0c;超过200万字的技术文&#xff0c;其中一些专栏作者的贡献功不可没。我们公众号只做原创内容&#xff0c;因为我并不希望平台成为一个靠复制转载内…

通过运维编排实现自动化智能运维与故障自愈

自动化帮助用户消除重复性任务&#xff0c;从而降低运营成本、提高效率并提高团队生产力。但是&#xff0c;将自动化引入复杂的 IT 环境还需要编排。编排是指一次性自动执行多项任务&#xff0c;涉及到计算机系统、中间件和服务的自动布置、协调和管理&#xff0c;利用自动执行…

10个最频繁使用的聚类算法 Python 实现(附完整代码)

大家好&#xff0c;聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术&#xff0c;用于发现数据中的有趣模式&#xff0c;例如基于其行为的客户群。 有许多聚类算法可供选择&#xff0c;对于所有情况&#xff0c;没有单一的最佳聚类算法。相反&#xff0c;最好探索一…

46. 批量规范化

训练深层神经网络是十分困难的&#xff0c;特别是在较短的时间内使他们收敛更加棘手。 本节将介绍批量规范化&#xff08;batch normalization&#xff09;,这是一种流行且有效的技术&#xff0c;可持续加速深层网络的收敛速度。 再结合在 将介绍的残差块&#xff0c;批量规范…

盘点 | 基于小程序语法的跨端开发平台

最近&#xff0c;微信于2022年12月18日悄悄的推出了一款名叫“Donut”的开发平台。根据开发文档的产品介绍来看&#xff0c;该平台的核心是多端框架&#xff0c;支持使用小程序进行代码编写&#xff0c;并进行多端编译&#xff0c;从而实现多端开发。 目前Donut开发平台已经开…

Android 音视频入门/进阶教程

后续的音视频文章&#xff0c;都会在这里更新 作为安卓开发仔&#xff0c;对音视频这块&#xff0c;一直是比较感兴趣的&#xff0c;所以&#xff0c;本着学习和记录的态度&#xff0c;我也把我所学的知识记录起来&#xff0c;希望对想音视频感兴趣的小伙伴有所帮忙。 一. 基础…

SpringBoot maven 项目 JDBC 连接多源数据库

此方法支持 mysql&#xff0c;oracle&#xff0c;postgre&#xff0c;sqlserver等等 基本逻辑&#xff1a;1. 加载驱动; 2. 通过DriverManager传入数据库地址&#xff0c;用户名&#xff0c;密码&#xff0c;获取本地数据库连接 1. pom文件下添加依赖 <dependency><…

Android 多线程下载以及断点续传

多线程下载 在日常开发中&#xff0c;我们不可避免的会接到类似这样的需求&#xff0c;下载一个比较大的素材文件或者安装包文件&#xff0c;以此实现APP的自动更新&#xff0c;APP内的素材替换等。由于一般此类文件都比较大&#xff0c;一般会在50M以上&#xff0c;如果我们不…

高效好用的开发工具箱——猿如意

目录 前言&#xff1a; 1.我常用的功能介绍 2.主要功能chatGPT测评 3.我的使用体验和改进建议 前言&#xff1a; 猿如意是一款帮助开发的效率工具&#xff0c;集成了许多有用的工具和文档教程。帮助开发者提升开发效率&#xff0c;帮你从“问题”找到“答案”。尤其是12月…

加注超融合 星辰天合推出 XHERE V2 系列

近日&#xff0c;北京星辰天合科技股份有限公司&#xff08;简称&#xff1a;“XSKY星辰天合”&#xff09;成功举办了主题为“能存会算&#xff0c;创新不断”的 XHERE 超融合新品渠道推介会&#xff0c;正式向市场推出 XHERE V2 超融合软件平台。通过继续加大对超融合产品线的…

上云节省 35%计算资源,420 个运维人天:运满满实时计算实践和思考

摘要&#xff1a;本文整理自满帮实时数据团队 TL 欧锐&#xff0c;在 FFA 2022 行业案例专场的分享。本篇内容主要分为四个部分&#xff1a;满帮业务及平台架构介绍实时数据实时产品未来计划Tips&#xff1a;点击「阅读原文」查看原文视频&演讲 ppt01满帮业务及平台架构介绍…

数据可视化系列-01大数据可视化基础

文章目录1.概述2.大数据可视化基础2.1 数据可视化基础知识1、数据可视化简史&#xff1a;2、数据可视化是什么&#xff1a;3、数据可视化的分类&#xff1a;4、数据可视化流程&#xff1a;5、数据可视化的意义&#xff1a;2.2 认识BI和数据可视化工具1、BI的简介&#xff1a;BI…

RabbitMQ:订阅模型-匹配模式

阅模型-匹配模式&#xff0c;相比于前两种订阅模型&#xff0c;是更细致的分组&#xff0c;允许 在RoutingKey 中使用匹配符 *&#xff1a;匹配一个单词#&#xff1a;匹配0个或多个单词 RabbitMQ 订阅模型-匹配&#xff08;topics&#xff09;模式主要有以下六个角色构成&#…

FFmpeg功能命令汇总

前言 如此强大的FFmpeg&#xff0c;能够实现视频采集、视频格式转化、视频截图、视频添加水印、视频切片、视频录制、视频推流、更改音视频参数功能等。通过终端命令如何实现这些功能&#xff0c;Richy在本文做一记录&#xff0c;以备之后查阅。 注意&#xff1a;下面一一列举…