485. Max Consecutive Ones

練習日期:2026-03-12

難度:Easy

類型:Array

📘 題目敘述

給你一個二元陣列 nums,請回傳陣列中連續出現的 1 的最大數量。

條件限制

  • 1 <= nums.length <= 10^5
  • nums[i] 只會是 01

🧠 解題思路

這題很直接,就是一路掃過整個陣列,邊走邊記:

  • 目前這一段連續 1 有幾個
  • 到目前為止,最大的連續 1 有幾個

所以我用兩個變數:

  • count:目前連續 1 的長度
  • ans:目前遇過的最大連續 1 長度

掃描陣列時:

  • 如果現在這個數字是 1

    • 代表目前這段連續 1 還可以延長,所以 count++
  • 如果現在這個數字是 0

    • 代表連續 1 被中斷,所以 count = 0

每一步都順便更新:

  • ans = max(ans, count)

這樣整個陣列掃完之後,ans 就是答案。

也就是說,這題的核心就是:

掃一次陣列,用 count 記目前連續 1 的長度,用 ans 記最大值。

所有變數

  • ans:目前為止遇到的最大連續 1 數量
  • count:目前這一段連續 1 的數量

🪜 主要流程步驟

1. 先準備 ans 和 count

int ans = 0;
int count = 0;

這裡:

  • ans 一開始設成 0,表示目前還沒看到任何連續 1
  • count 一開始也設成 0,表示目前這段連續 1 的長度是 0

2. 掃過整個陣列 nums

for (int i : nums) {

這裡用 range-based for,把 nums 裡的每個元素依序取出來。

每次迴圈都處理目前這個數字 i


3. 如果目前是 1,就把連續長度加一

if (i == 1) {
    count++;
}

如果目前這格是 1,代表這一段連續 1 還沒中斷,所以直接把 count 加一。

例如原本這段已經有 2 個連續 1,現在又讀到一個 1,那就變成 3 個。


4. 如果目前是 0,就把 count 歸零

else {
    count = 0;
}

如果目前這格是 0,代表連續 1 到這裡中斷了。

所以之前那段連續 1 已經結束,現在要重新開始計算,因此把 count 重設成 0


5. 每一步都更新目前最大值 ans

ans = max(ans, count);

不管目前是 1 還是 0,每一步都可以更新一次最大值。

因為:

  • 如果目前是 1count 可能剛剛變大
  • 如果目前是 0count 會變成 0,這時更新也不會有問題

所以這樣一路掃下來,ans 會一直記住最大那段連續 1 的長度。


6. 最後回傳 ans

return ans;

當整個陣列掃完之後,ans 就是全陣列中最長的連續 1 數量,直接回傳即可。

⏱️ 複雜度

  • 時間複雜度:O(n)
    其中 n = nums.length,整個陣列只掃一次。

  • 空間複雜度:O(1)
    只用了固定數量的變數。

💻 程式碼實作

class Solution {
public:
    int findMaxConsecutiveOnes(vector<int>& nums) {
        int ans = 0;
        int count = 0;
        for (int i : nums) {
            if (i == 1) {
                count++;
            } else {
                count = 0;
            }
            ans = max(ans, count);
        }
        return ans;
    }
};

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

作者: scottnick
撰寫日期: 2026-03-12
類別:
原文連結: https://scottnick.github.io/cpp-notes/all%20problems/485-max-consecutive-ones.html