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^5
  • nums[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 是数组的长度。算法只需要遍历数组一次,使用常数额外空间。

相关题目