最大连续1的个数
给定一个二进制数组, 计算其中最大连续1的个数。
示例 1:
输入: [1,1,0,1,1,1]
输出: 3
解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.
解题思路
方法一:一次遍历数组
定义一个 maxCount 用来记录当前数组中最大连续 1 的个数。
遍历时在没有遇到 0 时 count 值加 1。当遇到0时,先看当前 count 值是否是当前数组中最大连续 1 的个数再令 count = 0,重新开始计数,重复此过程直到数组末尾。最后还要再一次判断 count 和 maxCount 的大小。因为,若nums = {1},若没有判断最后的maxCount值为 0,与答案不符合。
代码
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int n = nums.length;
int count = 0;
int maxCount = 0;
for (int i=0;i<n;i++) {
if (nums[i] == 1) {
count++;
} else {
maxCount = Math.max(maxCount, count);
count = 0;
}
}
maxCount = Math.max(maxCount, count);
return maxCount;
}
}
时间复杂度:只遍历了一次数组且数组的长度为n,复杂度为O(n)
空间复杂度:没有额外开辟新的空间,复杂度为O(1)
方法二:双指针(滑动窗口)
双指针:left 指针和 right 指针,同时指向数组开头。、
- 若当前值为 1,则令 right 指针右移。
- 若当前值为 0,则比较窗口大小 right - left(因为值为 0 的元素不需要,所以应该是去掉 0 元素的窗口大小),并使 right 指针右移,同时 left 指针右移指向当前 right 指针所指向的位置。
最后还要再一次判断 count 和 maxCount 的大小。因为,若nums = {1},若没有判断最后的maxCount值为 0,与答案不符合。
代码
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int n = nums.length;
int left = 0, right = 0;
int maxCount = 0;
while (right < n) {
if (nums[right] == 1) {
right++;
} else {
maxCount = Math.max(maxCount, right - left);
right++;
left = right;
}
}
maxCount = Math.max(maxCount, right - left);
return maxCount;
}
}
时间复杂度:因为遍历数组的长度为n,复杂度为O(n)
空间复杂度:没有开辟新的空间,复杂度为O(1)
两种方法比较来看,滑动窗口要比一次遍历数组要更快(因为,滑动窗口中不需要用 count 来对遇到 0 时当前的子区间中的元素 1 的个数来计数,所以更快了)!