力扣刷题
题号 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]中,因为他俩就不相等啊,但是当时却没有想到。
如果你有简单而且有思路的话不妨动手试试,告诉我吧,大侠。希望一起进步。
目前我是一个菜鸟,第一次认真开始准备写博客,博客可能写的不好,毕竟我还是一个菜鸟啊。
愿历尽千帆,归来仍是少年!