1.题目描述:
给定一个二进制数组, 计算其中最大连续 1 的个数。示例给定:[1,1,0,0,1,1,1],输出结果为3。
2.自己写的代码:
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int max = 0;
for(int i = 0;i < nums.length;i++){
int count = 0;
while(i < nums.length && nums[i] == 1 ){
count++;
i++;
}
if(count > max){
max = count;
}
}
return max;
}
}
优化代码:
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int max = 0;
int count = 0;
for(int i = 0;i < nums.length;i++){
if(nums[i] == 1){
count++;
}else{
count = 0;
}
if(count > max){//每次都比较大小
max = count;
}
}
return max;
}
}
最优解(以上均与官方解思路一致):
public int findMaxConsecutiveOnes(int[] nums) {
int max = 0, cur = 0;
for (int x : nums) {
cur = x == 0 ? 0 : cur + 1;
max = Math.max(max, cur);
}
return max;
}
3.双指针方法/滑动窗口方法:
使用left,right指针分别指向连续1的最左端和最右端,一旦出现0元素则left指针右移动到先前连续1的right后一位,最终获取right-left的最大值。
图解如下:
代码如下:
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int left = 0,right = 0,count = 0;
while(right < nums.length){
if(nums[right] == 0){
count = Math.max(count,right - left);
left = right + 1;//下一段起始点
}
right++;//right指针用来遍历
}
count = Math.max(count,right - left);
return count;
}
}