📘 題目敘述
給你一個二元陣列 nums,請回傳陣列中連續出現的 1 的最大數量。
條件限制
1 <= nums.length <= 10^5nums[i]只會是0或1
🧠 解題思路
這題很直接,就是一路掃過整個陣列,邊走邊記:
- 目前這一段連續
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,表示目前還沒看到任何連續1count一開始也設成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,每一步都可以更新一次最大值。
因為:
- 如果目前是
1,count可能剛剛變大 - 如果目前是
0,count會變成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/