如何解出:最大连续 1 的个数

力扣刷题

题号 485:最大连续 1 的个数

题目描述

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

示例:

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

提示:

输入的数组只包含 0 和 1 。
输入数组的长度是正整数,且不超过 10,000。

解题思路

1、定义一个二进制数组
2、定义一个集合存储计数器
3、定义一个计数器count,定义一个i循环遍历二进制数组,定义索引k,当数组不连续重复时把索引i赋给j,数组即从索引j便利此时计数器从0开始计数
4、当数组长度为1时判断nums[0]是否为0,返回0,否则循环数组
5、从j=0开始循环遍历逐一比对,并且当为1时计数器开始计数,如果nums[j]==nums[0]==1时,说明计数器是从第索引0位置开始计数即多加了1,因此返回的数需要减一如果是从索引k(k>0)开始计数则与下一个k+1位置进行对比,则没有多加,将数值添加到集合中
5、返回集合最大连续为1的计数器值

上代码

public static int test(){
    /**
     * 1、定义一个二进制数组
     * 3、定义一个集合存储计数器
     * 2、定义一个计数器count,定义一个i循环遍历二进制数组,定义索引k,当数组不连续重复时把索引i赋给j,数组即从索引j便利此时计数器从0开始计数
     * 3、当数组长度为1时判断nums[0]是否为0,返回0,否则循环数组
     * 4、从j=0开始循环遍历逐一比对,并且当为1时计数器开始计数,如果nums[j]==nums[0]==1时,
     * 说明计数器是从第索引0位置开始计数即多加了1,因此返回的数需要减一
     * 如果是从索引k(k>0)开始计数则与下一个k+1位置进行对比,则没有多加,将数值添加到集合中
     * 5、返回集合最大连续为1的计数器值
     *
      */

    //二进制数组
    int[] nums={0,1};
    //集合存储计数器
    List<Integer> list=new ArrayList<>();
    //计数器
    int count =1;
    //返回最大连续值的计数器
    int res=0;
    //遍历数组
    int i=0;
    //当连续值断掉,则把j=i,shuzu
    int j=0;
    //如果数组长度为1且索引0位置数值为0则返回0
    if(nums.length<=1){
        if(nums[0]==0){
            res = 0;
        }
    }
    //循环遍历
    for( i=j;i<nums.length;i++){
        //如果连续相等,计数器开始计数
        if(nums[i]==nums[j]&&nums[j]==1){
            count++;
            if(res<=count){
                res=count;
            }
            //当从索引为0开始进行对比时,索引0会做一次比对,应该和索引为1进行比对,因此返回的计数器此时需要减一
            if(j==0&& nums[0]==1){
                res=res-1;
            }
            //将计数器添加到集合中,避免不重复时计数器被清空
            list.add(res);
        }
        //如果不连续的1,则计入集合
        else if(nums[i]==1){
            j=i;
            count=1;
            res=1;
            list.add(res);
        }
        //当断掉的时候j=i,计数器变为1;
        else{
            j=i;
            count=1;
        }
    }
    //输出最大连续1的计数器
    if(list.size()==0){
        return res;
    }else{
        int max=Collections.max(list);
        return max;
    }
}

我的想法

我采用的是一个比较复杂且麻烦的解题方法,主要是我想这道题的时候脑子里就蹦出了这个思路,最开始的时候我是统计出最大连续的个数,正当我窃喜的时候,这道题需要的是为1的最大连续个数,我就开始了缝补之路,我先定义一个二建制数组,当然你可以自定义随便一个二进制数组,然后遍历,在这遍历的时候我采用截断的手法,当到达索引为k的地方,就把索引k返到数组遍历的初始位置,即从位置为k的位置开始遍历,这里需要注意的是如果索引k不为0,则k位置会和k+1位置进行比对,如果索引从0位置开始则会和0位置进行重复比对,也就是计数器多加了1,此时就需要减去1,如果不是从索引0开始则不需要减去1,这里我头疼了一会,我说为啥子从索引0开始就一直多1呢?后来在进去看好家伙原位置比对了肯定多加1啊,最开始我才用的是返回值轮换法,就是比对计数器大小,当然在这里我忽略了一点就是在遍历到不连续的值时,计数器会被清空变为0,值被覆盖,所以就获取不到正确的计数器值,于是我采取集合的方式进行添加,因此在这里也耽误了时间,后面还遇到了就是int [] nums={0,1,0,1}这种情况,我没有去进行判断就一直判为空,后来思考了一会,我遍历到num[1]=1时,后一位num[2]=0,这两个进行比对并不会进入到num[i]==num[j]中,因为他俩就不相等啊,但是当时却没有想到。
如果你有简单而且有思路的话不妨动手试试,告诉我吧,大侠。希望一起进步。
目前我是一个菜鸟,第一次认真开始准备写博客,博客可能写的不好,毕竟我还是一个菜鸟啊。
愿历尽千帆,归来仍是少年!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值