开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
一、题目描述:
给定一个二进制数组 nums , 计算其中最大连续 1 的个数。
示例 1:
输入:nums = [1,1,0,1,1,1]
输出:3
解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.
示例 2:
输入:nums = [1,0,1,1,0,1]
输出:2
提示:
- 1 <= nums.length <= 10^5
- nums[i] 不是 0 就是 1
二、思路分析:
分别设置两个计数变量,finalCount用于存储数组中最大连续1的数量,tmpCount用于记录数组中各部分连续1的数量。通过遍历数组,不断动态更新二者的值来获得最终结果。
遍历数组,当发生数组中1不连续的情况时,需要检查并更新上述两个变量的值,具体包含如下两种情况:
- 若finalCount小于tmpCount,则需要将tmpCount赋给finalCount并将tmpCount置0。
- 若finalCount大于等于tmpCount,则仅将tmpCount置0即可
另外,考虑到全1数组这种特殊情况。在当前遍历的元素为1时,除了要将tmpCount加1外,还要判断tmpCount是否大于finalCount,若大于则需要更新finalCount,防止元素全为1时finalCount没有得到及时更新。虽然代码运行通过但此处明显存在冗余判断,可进行进一步的优化。
再者,如提示所述,输入的数组只有0和1两个值,这意味着本题不需要显式地使用两个计数变量也能够得到最终结果。
三、AC 代码:
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int finalCount = 0;
int tmpCount = 0;
for(int i=0; i<nums.length; i++){
if(nums[i]==1){
tmpCount = tmpCount + 1;
if(finalCount < tmpCount){
finalCount = tmpCount;
}
}else if(finalCount < tmpCount){
finalCount = tmpCount;
tmpCount = 0;
}else{
tmpCount = 0;
}
}
return finalCount;
}
}