Medium草稿★★★★★O(n) 時間 · O(n) 空間
ArrayHash TablePrefix Sum
Patterns➕ 前綴和#️⃣ 雜湊
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

560Subarray Sum Equals KArrays & HashingMediumArrays & Hashing

給定整數陣列 nums 和整數 k,回傳和等於 k 的連續子陣列的數量。

Example:

Input: nums = [1,1,1], k = 2 Output: 2

Intuition

TIP

核心思路:Prefix Sum + HashMap。如果 prefix[j] - prefix[i] == k,則子陣列 [i+1, j] 的和為 k。用 HashMap 記錄每個前綴和出現的次數。

Approaches

1. Brute Force — O(n^2) / O(1)
  • Idea: 枚舉所有子陣列的起點和終點,計算和
  • Time: O(n^2) - 兩層迴圈
  • Space: O(1)
class Solution {
    fun subarraySum(nums: IntArray, k: Int): Int {
        var count = 0
        for (i in nums.indices) {
            var sum = 0
            for (j in i until nums.size) {
                sum += nums[j]
                if (sum == k) count++
            }
        }
        return count
    }
}
⭐ 2. Prefix Sum + HashMap — O(n) / O(n)
  • Idea: 維護前綴和 sum,用 HashMap 記錄每個前綴和出現的次數。每到一個位置,查找 sum - k 出現了幾次
  • Time: O(n) - 一次遍歷
  • Space: O(n) - HashMap
class Solution {
    fun subarraySum(nums: IntArray, k: Int): Int {
        val prefixCount = HashMap<Int, Int>()
        prefixCount[0] = 1  // 空前綴
        var sum = 0
        var count = 0

        for (num in nums) {
            sum += num
            count += prefixCount.getOrDefault(sum - k, 0)
            prefixCount[sum] = (prefixCount[sum] ?: 0) + 1
        }

        return count
    }
}

WARNING

初始化 prefixCount[0] = 1 很重要,代表「空前綴」,用於處理從索引 0 開始的子陣列和恰好等於 k 的情況。

🔑 Takeaways

Ladders 看全部 →

前綴和

預處理換查詢,配雜湊解子陣列。

  1. 1#303Range Sum Query - ImmutableEasy一維區間和 O(1) 查詢
  2. 2#304Range Sum Query 2D ImmutableMedium二維區間和(容斥)
  3. 3
  4. 4#523Continuous Subarray SumMedium前綴和取模找同餘