题目描述
- 最大连续1的个数
给定一个二进制数组, 计算其中最大连续1的个数。
示例 1:
输入: [1,1,0,1,1,1]
输出: 3
解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.
注意:
输入的数组只包含 0 和1。
输入数组的长度是正整数,且不超过 10,000。
解题思路
一个数组,两个指针,一次遍历,时间复杂度O(n),空间复杂度O(1)
双指针大致思路
假设数组长度为n,定义两个指针i,j,初始时i=j=0,两个指针均要向右移动,具体而言,快指针j起到遍历的作用,结束条件为j=n-1,即达到数组末尾,而i的移动是由题目条件决定的,例如数组为【1,1,1,1】,这样我们就不需要移动i,i一直为0,如果数组为【1,1,0,1,1】,这样我们当nums[j]=0的时候,i直接变为j+1,跳过0去寻找下一串连续1的第一个。
如何存放最1大连续值
略,见代码部分
代码
public class Solution485 {
public int findMaxConsecutiveOnes(int[] nums) {
int maxResult = 0, nowResult = 0; //maxResult 为最终返回结果 nowResult 为当前找到的结果
int i = 0, j = i;
while (j < nums.length){
if (nums[j] == 1){
nowResult++;
j++;
}else {
if (nowResult > maxResult)
maxResult = nowResult;
nowResult = 0; //一定要置0
i = j + 1; //重新定位i 和 j
j = i;
}
}
//避免特殊情况 如[1]
return maxResult < nowResult ? nowResult : maxResult;
}
}
优化代码
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int maxResult = Integer.MIN_VALUE;
int i = 0;
for(int j = 0; j < nums.length; ++j){
if (nums[j] == 0){
maxResult = Math.max(maxResult,j-i);
i = j + 1;
}
} //注意循环结束后 i的值被记录下来了
maxResult = Math.max(maxResult,nums.length-i);
return maxResult;
}
}