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

485. 最大连续1的个数 这是一个典型的数组遍历和计数问题。通过遍历数组,记录连续。给定一个二进制数组, 计算其中最大连续1的个数。的个数,并在遍历过程中更新最大连续。 阅读详情

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

在这里插入图片描述

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;
    }

4. 解法3- 秒

这个是在评论区看到的,觉得非常妙,所以记录一下。

完美利用题目中num[i] 非 0 即1 这个条件。

public int findMaxConsecutiveOnes(int[] nums) {
	if(nums == null || nums.length == 0) return 0;
	int result = 0;
	int cur = 0;
	
	for(int i =0; i < nums.length; i++){
		// 注意这句话,完美利用了非0即1的特点。
		// 加上当前数字再乘以当前数字 <==> 遇到一加一,遇到零清零
		cur = (cur+nums[i]) * nums[i];
		result = Math.max(result,cur);
	}
	return result;
}

数组部分刷题记录 以下仅为个人刷题笔记记录,如有错误,敬请指正,勿喷。 数组部分刷题记录 一、数组的遍历 question:485 给定一个二进制数组 nums , 计算其中最大连续 1 的个数。 示例1: 输入:nums = [1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3. 示例二: 输入:nums = [1,0,1,1,0,1] 输出:2 answer: 设置一个temp变量统计当前连续1的个数。当遇到0时,比较当前1的个数 与之前最大值。 class 阅读详情

相关推荐

2021年2月19日 Leetcode每日一题:1004. 最大连续1的个数 III

最大连续1的个数Ⅲ 1.题目描述 给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。 返回仅包含 1 的最长(连续)子数组的长度。 2.示例 示例 1: 输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2 输出:6 解释: [1,1,1,0,0,1,1,1,1,1,1] 粗体数字从 0 翻转到 1,最长的子数组长度为 6。 示例 2: 输入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3

hualuolll的博客 1091

最大连续1的个数

最大连续1的个数

LTY3301398968的博客 837

LeetCode——485,最大连续1的个数

/** * \* Created: liuhuichao * \* Date: 2019/4/23 * \* Time: 7:53 PM * \* Description:最大连续1的个数 * 给定一个二进制数组, 计算其中最大连续1的个数。 * <p> * 示例 1: * <p> * 输入: [1,1,0,1,1,1] * 输出: 3 * 解释: 开...

我们的征途是星辰大海 897

每日一题——力扣——最大连续1的个数

题目来源于力扣——485. 最大连续 1 的个数 - 力扣(LeetCode) (leetcode-cn.com) 给定一个二进制数组, 计算其中最大连续 1 的个数。 示例: 输入:[1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3. 为了得到数组的最大连续1的个数,我们需要遍历数组。 遍历数组的时候我们需要记录两个信息 分别是最大连续1的个数和当前连续1的个数 如果当前元素是1,则将当前连续1的个数加1,使用之前的连

爱编程的晖哥的博客 896

【Gazebo安装指南】Ubuntu22.04LTS环境下的高效配置与常见问题解决

本文提供了在Ubuntu 22.04 LTS系统上高效安装和配置Gazebo仿真环境的详细指南。针对Gazebo Classic版本,文章对比了通过ROS 2仓库和Ubuntu官方仓库两种主流安装方法,并重点解决了安装过程中常见的软件包定位、模型下载及图形驱动等问题,帮助用户快速搭建稳定的机器人仿真开发环境。

weixin_29279101的博客 436

SAP CO-PA数据传送避坑指南:销售开票与FI/MM记账的日常配置实操(含KEKF/KE4I/KEI2)

本文深入解析SAP CO-PA数据传送中的常见配置问题,特别是销售开票与FI/MM记账环节的实操避坑指南。通过KEKF/KE4I/KEI2等关键配置点的详细说明,帮助用户避免数据失真和重复记录,提升获利能力分析的准确性。文章结合实战案例,揭示官方文档未提及的'数据黑洞'形成机制,为SAP顾问提供实用的排雷手册。

weixin_26905487的博客 390

力扣485 最大连续1的个数

力扣485 最大连续1的个数 题干 给定一个二进制数组, 计算其中最大连续1的个数。 示例 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: 输入的数组只包含 0 和1。 输入数组的长度是正整数,且不超过 10,000。 解析 刷到这道题的第一印象就是和之前的力扣053 最大子序和非常相似。可以用动态规划(DP)的思想来解。 本题数组是一个线性结构,只需要用一个一维数组即可求解,关键是如何找出当前元素和上一个元素之间的

Castle Yeager 成长之路 240

免Root抓包神器Packet Capture:安卓App数据捕获全攻略

本文详细介绍了免Root安卓抓包神器Packet Capture的安装与使用全攻略。通过利用安卓系统的VPN Service API,该工具无需Root权限即可捕获并解密App的HTTP/HTTPS网络流量。文章从核心原理、证书安装、实战抓包步骤到结果分析与常见问题排查,提供了完整指南,是移动端开发、安全测试和数据分析的实用利器。

weixin_29232507的博客 1075

Java实现 LeetCode 485 最大连续1的个数

485. 最大连续1的个数 给定一个二进制数组, 计算其中最大连续1的个数。 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: 输入的数组只包含 0 和1。 输入数组的长度是正整数,且不超过 10,000。 class Solution { public int findMaxConsecutiv...

南 墙 1万+

Python爬虫实战:5分钟搞定东方财富A股数据抓取(附完整代码)

本文提供了一套基于Python的A股数据自动化采集与分析系统构建方案。文章详细解析了如何通过稳健的爬虫框架从东方财富等公开数据源高效抓取A股数据,并设计数据库进行自动化存储与管理,特别适合量化研究和数据分析场景。

weixin_29062963的博客 4429

永磁同步电机矢量控制——电流内环前馈解耦策略

在采用永磁同步电机矢量控制时,ud和uq的指令值存在耦合项。需要对其进行解耦,目前,常用的解耦设计方法有前馈解耦、偏差解耦以及内模控制,本文主要分享电流内环前馈解耦控制策略。

a12312341ll的博客 8691

【LeetCode每日一题】——485.最大连续 1 的个数

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

IronmanJay 1239

MuJoCo 入门教程(一)

在 MuJoCo 仿真中输入自定义数字有三种方法。首先,可在 XML 中定义全局数字字段。它们有一个名称和一个实数值数组。其次,可以通过特定元素的自定义数组来扩展某些模型元素的定义。具体方法是在 XML 元素大小中设置 nuser_XXX 属性。第三,数组 mjData.userdata 不用于任何 MuJoCo 计算。用户可以在这里存储自定义计算的结果;请记住,所有随时间变化的内容都应存储在 mjData 中,而不是 mjModel 中。自定义文本字段可以保存在模型中。

机器人控制与仿真应用 1万+

[Golang]力扣Leetcode - 485. 最大连续 1 的个数(遍历)

[Golang]力扣Leetcode - 485. 最大连续 1 的个数(遍历)

皮埃尔的博客 325

【WRFDA安装第一期】安装 WRFDA 以运行 3DVAR/4DVAR数据同化

【WRFDA安装第一期】安装 WRFDA 以运行 3DVAR/4DVAR数据同化

WW、forever的博客 1895

在YOLO中扩充新类别并且不影响旧类的识别精度

让我们先从简单的部分开始:用我们的新类训练自定义 YOLOv8 模型。在本教程中,我们将向模型添加车牌类。我们将使用Roboflow 中的一个数据集。这个数据集有两个车牌类。在开始训练之前,我们还必须对库进行一些更改。为了节省时间,我还将本教程中我们将进行的更改转换为补丁该补丁包含多项更改,但大多数更改都用于指南的下一部分。if RANK!= -1:是的,我们将编写一个回调。我们希望将此自定义训练模型的头部与 COCO 预训练模型中的旧头部一起使用。

如果想成为中心,那么就到中心去吧。 1225

Leetcode 485. 最大连续1的个数

Leetcode 485. 最大连续1的个数 给定一个二进制数组, 计算其中最大连续1的个数。 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: 输入的数组只包含 0 和1。 输入数组的长度是正整数,且不超过 10,000。 常规遍历 class Solution { public int findMaxConsecutiveOnes(int[] nums) { int count = 0;

EIUC_Thread的博客 281

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++描述 LeetCode 485. 最大连续1的个数

C++描述 LeetCode 485. 最大连续1的个数   大家好,我叫亓官劼(qí guān jié ),在优快云中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在优快云中写博客,唯一博客更新的地址为:亓官劼的博客 ,同时正在尝试在B站中做一些内容分享,B站主页为: 亓官劼的B站主页 本文原创为亓官劼,请大家支持原创,部分平台一直在恶意盗取博主的文章!!! 若需联系博主,可以联系本人微信:qiguanjie2015 给定一个二进制数组, 计算其中最大连续1的个数。 示例

一起加油 3877

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Leetcode 485. 最大连续1的个数 C++

Leetcode 485. 最大连续1的个数 题目 给定一个二进制数组, 计算其中最大连续1的个数。 示例 : 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: 输入的数组只包含 0 和1。 输入数组的长度是正整数,且不超过 10,000。 题解 方法一:暴力方法,找连续的1 方法二:动态规划,dp[i]表示以nums[i-1]结尾的最大连续1的个数 代码为方法一 代码 int findMaxConsecutiveOnes(

weixin_43750513的博客 467

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

LeetCode 485: 最大连续1的个数

目录LeetCode 485: 最大连续1的个数题目描述解题 LeetCode 485: 最大连续1的个数 题目描述 给定一个二进制数组, 计算其中最大连续1的个数。 【示例 】 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: 输入的数组只包含 0 和1。 输入数组的长度是正整数,且不超过 10,000。 解题     双指针法,有指针i和j,当i找到1时,j寻找相连的最后一个1后一个位置,由此可以计算当前连续1的个数。

s_Shune 163

LeetCode485(力扣485)最大连续1的个数 C++ 使用C++11for

485 最大连续1的个数 给定一个二进制数组, 计算其中最大连续1的个数。 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: 输入的数组只包含 0 和1。 输入数组的长度是正整数,且不超过 10,000。 我提交的代码 class Solution { public: int findMaxConsecutiveOnes(vector<int>& nums) { int

VegetableGirl的博客 364

力扣【485-最大连续1的个数】【数组-C语言】

遇到连续的1就累加求和(sum),为也就是1的个数,遇到0时,用max先记录当前最小连续1的个数,然后置sum=0,重新开始累计,若给定二进制数组是以1为最后一个元素,则程序最后再次更新max

一只喜欢code的fox 341

leetcode刷题之485.最大连续1的个数

leetcode刷题之485.最大连续1的个数 我不知道将去向何方,但我已在路上! 在这匆匆时光中,未曾谋面,相遇于斯,实在是莫大的缘分,感谢您的到访 ! 题目: 给定一个二进制数组, 计算其中最大连续1的个数。 示例: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: • 输入的数组只包含 ...

胡萝卜 322

力扣(leetcode)第485题最大连续1的个数(Python)

最后,我写了一篇MySQL教程,里面详细的介绍了MySQL的基本概念以及操作指令等内容,欢迎阅读!解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.给定一个二进制数组 nums , 计算其中最大连续 1 的个数。输入:nums = [1,1,0,1,1,1]输入:nums = [1,0,1,1,0,1]nums[i] 不是 0 就是 1.

qq_58737789的博客 789

LeetCode:485.最大连续1的个数——简单题简单做

我们可以发现我们目标返回值为3.count在遍历过程中是一个记录清理再记录的过程。而maxCount只保持最大的count数。这个通过Java的Math类库的max方法实现。我们定义一个指针i,从前到后的遍历目标数组,同时设置两个遍历——count和maxCount,开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.count变量在指针i遍历到元素0时清零。, 计算其中最大连续。

2301_78566776的博客 689

Leetcode485. 最大连续1的个数

Leetcode485. 最大连续1的个数 题目: 给定一个二进制数组, 计算其中最大连续1的个数。 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 题解: 用一个计数器 count 记录 1 的数量,另一个计数器 maxCount 记录当前最大的 1 的数量。 当我们遇到 1 时,count 加一。 当我们遇...

会流泪de鱼的博客 199
上一篇: 初识TypeScript编译器(tsc)
下一篇: Android的adb命令实战篇-1
Bert.King
博客等级 码龄15年 280粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值