题目描述
给定一个二进制数组, 计算其中最大连续1的个数。
示例
输入: [1,1,0,1,1,1]
输出: 3
解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.
说明
输入的数组只包含 0 和1。
输入数组的长度是正整数,且不超过 10,000。
解题思路
1.一次遍历(flag表示当前位前面是否存在1),不断刷新最大的连续1个数
java代码如下
public int findMaxConsecutiveOnes(int[] nums) {
int cur = 0;
int sum = 0;
boolean flag = false;
for (int i = 0; i < nums.length; i++) {
if(nums[i] == 1 && flag == false){ //本次连续1的第一个1
cur++;
flag = true;
}else if(nums[i] == 1 && flag == true){ //前面有1
cur++;
}else if(nums[i] == 0 && flag == true){ //一串连续的1之后的0
sum = cur > sum ? cur : sum;
cur = 0;
flag = false;
}else if(nums[i] == 0 && flag == false){ //前面没有连续的1只是出现0
continue;
}
if((i == nums.length - 1) && nums[i] == 1){ //这是最后一位为1的情况,如果不加则最后一段连续的1统计不到
sum = cur > sum ? cur : sum;
}
}
return sum;
}
代码还可以简化:
public int findMaxConsecutiveOnes(int[] nums) {
int cur = 0;
int sum = 0;
boolean flag = false;
for (int i = 0; i < nums.length; i++) {
if(nums[i] == 1 && flag == false){ //本次连续1的第一个1
cur++;
flag = true;
}else if(nums[i] == 1 && flag == true){ //前面有1
cur++;
}
//当当前连续的1被截断(可能是遍历到了末尾,也可能是初次遇到了0)的时候,需要更新sum
if(i == nums.length - 1 || (nums[i] == 0 && flag == true)){
sum = cur > sum ? cur : sum;
cur = 0;
flag = false;
}
}
return sum;
}
运行结果如下
2.对1的优化
其实无需用flag标记,代码可以更简洁
java代码如下
public int findMaxConsecutiveOnes1(int[] nums) {
int cur = 0;
int sum = 0;
for(int i = 0; i < nums.length; i++) {
if(nums[i] == 1) {
cur++;
} else {
sum = Math.max(sum, cur);
cur = 0;
}
}
return Math.max(sum, cur);
}
运行结果如下