解題說明
Number of Zero-Filled Subarrays
題目描述:
給定一個整數陣列 nums,計算所有元素皆為 0 的子陣列數量。
解題思路:
- 遍歷陣列,維護一個計數器
count記錄當前連續 0 的長度。 - 遇到 0 時,
count++,並將count加到答案中(因為以當前位置結尾的全零子陣列恰好有count個)。 - 遇到非零元素時,重置
count = 0。
例如連續 3 個零 [0, 0, 0] 貢獻的子陣列數為 1 + 2 + 3 = 6,正好是 n*(n+1)/2。
C++ 解法
複雜度分析
時間複雜度:O(n) — 單次遍歷陣列。
空間複雜度:O(1) — 只使用兩個變數。
虛擬碼
1. Initialize ans = 0, count = 0
2. For each num in nums:
a. If num == 0:
- Increment count
- Add count to ans
b. Else: reset count = 0
3. Return ans其他解法
分段統計法 O(n):先找出所有連續 0 的段,對每段長度 len,加上 len * (len + 1) / 2。邏輯等價但需要兩步處理。
暴力法 O(n^2):枚舉所有子陣列的起點和終點,檢查是否全為 0。時間複雜度過高。
延伸思考
- 如果要計算所有元素相同(不限於 0)的子陣列數量,如何修改?
- 如果改為計算「至少包含一個 0」的子陣列數量,做法為何?
- 如何將此方法推廣到二維矩陣中的全零子矩陣計數?