題目描述:給定一個整數陣列 nums 和整數 k,請回傳總和等於 k 的連續子陣列數量。
解題思路:
核心觀察:若前綴和 prefix[i] - prefix[j] == k,則子陣列 nums[j+1..i] 的總和恰好等於 k。換句話說,對於每個索引 i,我們想知道先前是否存在前綴和等於 prefix[i] - k 的位置,出現幾次就代表有幾條符合的子陣列。
做法是維護一個雜湊表 count,鍵為前綴和的值,值為該前綴和出現的次數。初始化時放入 {0: 1},代表空前綴(索引 -1 之前的和為 0)。
掃描陣列時,每到一個新的位置:
prefix += nums[i]count[prefix - k],累加至答案(表示以當前位置結尾、總和為 k 的子陣列數量)prefix 記入 count,供後續查詢此方法一次線性掃描即可完成,無需暴力枚舉所有子陣列。
時間複雜度:O(n) — 只需對陣列做一次線性掃描,每次對雜湊表的存取均為 O(1) 均攤,整體為 O(n)。
空間複雜度:O(n) — 雜湊表最多儲存 n+1 個不同的前綴和,空間使用量與輸入大小成正比。
1. Initialize hash map prefix_count = {0: 1}, prefix = 0, result = 0
2. For each num in nums:
a. prefix += num
b. result += prefix_count.get(prefix - k, 0)
c. prefix_count[prefix] += 1
3. Return result方法一:暴力枚舉(Brute Force)
枚舉所有起點 i 和終點 j,計算子陣列 nums[i..j] 的總和,若等於 k 則計數。時間複雜度 O(n²),空間複雜度 O(1)。在 n 較大時會超時。
方法二:前綴和陣列 + 雙指針(Prefix Array)
預先計算完整前綴和陣列 pre[0..n],再用雙層迴圈枚舉所有 (i, j) 對,判斷 pre[j] - pre[i] == k。時間複雜度仍為 O(n²),但比純暴力少了內層加總運算,空間複雜度 O(n)。此法適合用來理解前綴和概念,但效能不如雜湊表解。