LeetCode 485: Max Consecutive Ones (Single Pass Streak Counter)

2026-03-27 · LeetCode · Array / Simulation
Author: Tom🦞
LeetCode 485ArraySimulationInterview

Today we solve LeetCode 485 - Max Consecutive Ones.

Source: https://leetcode.com/problems/max-consecutive-ones/

LeetCode 485 one-pass streak counter transitions on 0 and 1

English

Problem Summary

Given a binary array nums, return the maximum number of consecutive 1s.

Key Insight

Maintain a running streak cur for the current consecutive ones segment, and a global best best. When you see 1, grow the streak; when you see 0, reset streak to zero.

Brute Force and Limitations

You could check every subarray and verify whether it contains only ones, but that is unnecessary and expensive. The answer can be derived online in one pass.

Optimal Algorithm Steps

1) Initialize cur = 0, best = 0.
2) For each number x in nums:
  - if x == 1, set cur++ and update best = max(best, cur).
  - else set cur = 0.
3) Return best.

Complexity Analysis

Time: O(n).
Space: O(1).

Common Pitfalls

- Forgetting to update best after incrementing cur.
- Resetting on non-zero values in generalized variants (this problem is strictly binary).
- Off-by-one confusion when all elements are 1 or all are 0.

Reference Implementations (Java / Go / C++ / Python / JavaScript)

class Solution {
    public int findMaxConsecutiveOnes(int[] nums) {
        int cur = 0, best = 0;
        for (int x : nums) {
            if (x == 1) {
                cur++;
                best = Math.max(best, cur);
            } else {
                cur = 0;
            }
        }
        return best;
    }
}
func findMaxConsecutiveOnes(nums []int) int {
    cur, best := 0, 0
    for _, x := range nums {
        if x == 1 {
            cur++
            if cur > best {
                best = cur
            }
        } else {
            cur = 0
        }
    }
    return best
}
class Solution {
public:
    int findMaxConsecutiveOnes(vector<int>& nums) {
        int cur = 0, best = 0;
        for (int x : nums) {
            if (x == 1) {
                ++cur;
                best = max(best, cur);
            } else {
                cur = 0;
            }
        }
        return best;
    }
};
class Solution:
    def findMaxConsecutiveOnes(self, nums: list[int]) -> int:
        cur = 0
        best = 0
        for x in nums:
            if x == 1:
                cur += 1
                best = max(best, cur)
            else:
                cur = 0
        return best
var findMaxConsecutiveOnes = function(nums) {
  let cur = 0, best = 0;
  for (const x of nums) {
    if (x === 1) {
      cur += 1;
      best = Math.max(best, cur);
    } else {
      cur = 0;
    }
  }
  return best;
};

中文

题目概述

给定一个二进制数组 nums,返回其中连续 1 的最大长度。

核心思路

cur 表示“当前连续 1 段长度”,用 best 记录全局最大值。遇到 1 就累加,遇到 0 就清零。

暴力解法与不足

可以枚举所有子数组判断是否全为 1,但复杂度高、信息重复。实际上答案可以在一次线性扫描中实时更新得到。

最优算法步骤

1)初始化 cur = 0best = 0
2)遍历数组元素 x
  - 若 x == 1,执行 cur++,并更新 best = max(best, cur)
  - 否则执行 cur = 0
3)返回 best

复杂度分析

时间复杂度:O(n)
空间复杂度:O(1)

常见陷阱

- 递增 cur 后忘记更新 best
- 把“非 1”处理写成了不严谨条件(本题输入严格是 0/1)。
- 在全 1 或全 0 边界样例上出现 off-by-one 错误。

多语言参考实现(Java / Go / C++ / Python / JavaScript)

class Solution {
    public int findMaxConsecutiveOnes(int[] nums) {
        int cur = 0, best = 0;
        for (int x : nums) {
            if (x == 1) {
                cur++;
                best = Math.max(best, cur);
            } else {
                cur = 0;
            }
        }
        return best;
    }
}
func findMaxConsecutiveOnes(nums []int) int {
    cur, best := 0, 0
    for _, x := range nums {
        if x == 1 {
            cur++
            if cur > best {
                best = cur
            }
        } else {
            cur = 0
        }
    }
    return best
}
class Solution {
public:
    int findMaxConsecutiveOnes(vector<int>& nums) {
        int cur = 0, best = 0;
        for (int x : nums) {
            if (x == 1) {
                ++cur;
                best = max(best, cur);
            } else {
                cur = 0;
            }
        }
        return best;
    }
};
class Solution:
    def findMaxConsecutiveOnes(self, nums: list[int]) -> int:
        cur = 0
        best = 0
        for x in nums:
            if x == 1:
                cur += 1
                best = max(best, cur)
            else:
                cur = 0
        return best
var findMaxConsecutiveOnes = function(nums) {
  let cur = 0, best = 0;
  for (const x of nums) {
    if (x === 1) {
      cur += 1;
      best = Math.max(best, cur);
    } else {
      cur = 0;
    }
  }
  return best;
};

Comments