JAVA基础算法(7)----- 最大连续 1 的个数( 优化版 )

发布于:2023-01-22 ⋅ 阅读:(555) ⋅ 点赞:(0)


​​​​​

最大连续 1 的个数

活动地址:CSDN21天学习挑战赛

一、题目

给定一个二进制数组 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.

二、解题

  • 首先解读一下这个题目 ----- 计算最大连续 1 的个数,这个题目很简单无非是遍历一遍对 1 的个数进行遍历利用一个变量记录最大情况、一个变量记录当前 1 的连续个数;
  • 但是我这边打算使用的是另外一个方法,寻找每一个 0 的坐标位置,利用 0 的坐标位置减去当前 0 的前一个 0 之后的第一个 1 的坐标位置;
  • 也就是说一个( 0,1,1,1,0 )的数组,我们在遍历到第二个 0 的时候,利用其坐标数值 4 减去它前一个 0 之后的坐标,因为它前一个 0 之后要么是 1 要么就是它本身,像这个数组就是坐标数值为 1 的元素,即当前数组连续 1 的最大个数为 4 - 1 = 3 ;

2.1

  • 由力扣网给出的模板我们可以看出要求是编写一个方法,在方法内传有一个数组,该数组为需要计算连续 1 个数的二进制数组;

在这里插入图片描述

图 2.1

2.2

  • 声明一个变量,用于记录数组的长度;
  • 声明一个变量,用于记录最大连续 1 的个数,该变量需要进行初始化为 0 ,表示当前最大连续 1 的个数为 0 ;
  • 建立一个变量,用于记录当前第一个 1 的位置,赋初值为 0 ;(在这个变量当中存储的坐标对应的值不一定就是 1 ,但是我们可以将其假设为是 1 的情况

在这里插入图片描述

图 2.2

2.3

  • 我们遍历整个数组,找出每一个为 0 的位置;
  • 因为用当前 0 的坐标号减去所记录的位置坐标,如果大于最大值则将这个值赋值至最大值当中;
  • 只要当前位置为 0 ,就表示所记录的坐标位置需要改变,将存储坐标位置的变量赋值为当前 0 的坐标号加一;(跟之前一样的原理,我们假设 0 后面一个位置存储的元素就是一个 1 ,哪怕后一个位置的元素不为 1 ,那该位置的元素一定为 0 ,按之前总结的性质计算当前连续 1 的个数时是同一个坐标号进行相减,那么得数也就为 0

在这里插入图片描述

图 2.3

2.4

  • 当遍历完之后,如果最后一个元素为 1 ,那么就会少计算一次连续为 1 的个数;
  • 这时我们可以用数组长度减去所记录的坐标号即可得到当前连续为 1 的个数,再用这个数去跟最大情况相对比;
  • 最后将所获得的最大个数返回至主函数;

在这里插入图片描述

图 2.4

三、代码分享及力扣评分

3.1 力扣评分

在这里插入图片描述

图 3.1

3.2 代码分享

class Solution {
    public int findMaxConsecutiveOnes(int[] nums) {
        int len = nums.length;
        int max = 0;
        int count = 0;

        
        for( int i = 0 ; i < len ; i++ ){
            if( nums[i] == 0 ){
                if( i - count > max )
                    max = i - count;
                count = i + 1;
            }
        }
        if( len - count > max )
            max = len - count;
        return max;
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到