Easy
题目描述
给定一个二进制数组 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^5nums[i]不是0就是1。
解题思路
这道题要求找出二进制数组中最大连续1的个数,是一个典型的滑动窗口/双指针问题。
解题思路
方法一:单次遍历(推荐)
维护两个变量:当前连续1的长度 current 和历史最大长度 maxCount。遍历数组时:
- 遇到1:当前长度加1
- 遇到0:更新最大值,重置当前长度
这种方法时间复杂度最优,空间复杂度为O(1)。
方法二:双指针 使用左右指针维护连续1的窗口,右指针遇到0时移动左指针到右指针位置。
方法三:分割法 按0分割数组,统计每段连续1的长度。
第一种方法最简洁高效,是最佳解法。核心思想是用一次遍历就能解决问题,避免了额外的指针操作或字符串处理开销。
代码实现
class Solution {
public:
int findMaxConsecutiveOnes(vector<int>& nums) {
int maxCount = 0;
int current = 0;
for (int num : nums) {
if (num == 1) {
current++;
maxCount = max(maxCount, current);
} else {
current = 0;
}
}
return maxCount;
}
};
class Solution:
def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
max_count = 0
current = 0
for num in nums:
if num == 1:
current += 1
max_count = max(max_count, current)
else:
current = 0
return max_count
public class Solution {
public int FindMaxConsecutiveOnes(int[] nums) {
int maxCount = 0;
int current = 0;
foreach (int num in nums) {
if (num == 1) {
current++;
maxCount = Math.Max(maxCount, current);
} else {
current = 0;
}
}
return maxCount;
}
}
var findMaxConsecutiveOnes = function(nums) {
let maxCount = 0;
let currentCount = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] === 1) {
currentCount++;
maxCount = Math.max(maxCount, currentCount);
} else {
currentCount = 0;
}
}
return maxCount;
};
复杂度分析
| 复杂度 | 大小 |
|---|---|
| 时间复杂度 | O(n) |
| 空间复杂度 | O(1) |
其中 n 是数组的长度。算法只需要遍历数组一次,使用常数额外空间。