活动地址: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.2
- 声明一个变量,用于记录数组的长度;
- 声明一个变量,用于记录最大连续 1 的个数,该变量需要进行初始化为 0 ,表示当前最大连续 1 的个数为 0 ;
- 建立一个变量,用于记录当前第一个 1 的位置,赋初值为 0 ;(在这个变量当中存储的坐标对应的值不一定就是 1 ,但是我们可以将其假设为是 1 的情况)
2.3
- 我们遍历整个数组,找出每一个为 0 的位置;
- 因为用当前 0 的坐标号减去所记录的位置坐标,如果大于最大值则将这个值赋值至最大值当中;
- 只要当前位置为 0 ,就表示所记录的坐标位置需要改变,将存储坐标位置的变量赋值为当前 0 的坐标号加一;(跟之前一样的原理,我们假设 0 后面一个位置存储的元素就是一个 1 ,哪怕后一个位置的元素不为 1 ,那该位置的元素一定为 0 ,按之前总结的性质计算当前连续 1 的个数时是同一个坐标号进行相减,那么得数也就为 0 )
2.4
- 当遍历完之后,如果最后一个元素为 1 ,那么就会少计算一次连续为 1 的个数;
- 这时我们可以用数组长度减去所记录的坐标号即可得到当前连续为 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;
}
}