题目
给定一个二进制数组 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
.
解题
方法一:遍历 找最近两个0之间的相隔位数
思路
由于二进制数组中只会出现 0
和 1
所以可以遍历数组,找出每两个最近的 0
之间相隔了多少位(不包括两边)就是某段连续 1
的个数,维护一个最大 1
个数不断更新即可。
需要注意的是:
- 如果数组中第一位不是 0 那么从
nums[0]
到第一个 0 出现为止,中间的连续 1 不会被记录,把数组的 -1 位也看作是一个 0 就可以解决这个问题。 - 如果数组中最后一位不是 0 那么从最后一个 0 出现的位置到
nums[len - 1]
为止,中间的 1 也不会被记录,在遍历完成后统计最后一段连续 1,如果有需要就更新答案就可以解决。
代码
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int ans = 0;
int prev = -1;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 0) {
ans = Math.max(ans, i - prev - 1);
prev = i;
}
}
return Math.max(ans, nums.length - prev - 1);
}
}
方法二:遍历 遇0计数增加遇1计数清零
思路
按理来说这中方法应该比第一种方法要好想,但我先想出来的是第一种🤣。
就像思路标题所说,遍历数组:
- 遇0则计数增加。
- 遇1则更新答案并把计数清零。
需要注意的是最后一次计数可能没被算上,所以返回答案时要再拿 count
和 ans
比一次。
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int ans = 0;
int count = 0;
for (int num : nums) {
if (num == 1) count++;
else {
ans = Math.max(ans, count);
count = 0;
}
}
return Math.max(ans, count);
}
}
评论区