Easy草稿★★★★★O(n) 時間 · O(n) 空間
ArrayPrefix SumDesign
Patterns🏗️ 資料結構設計➕ 前綴和
尚未複習過

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

303Range Sum Query - ImmutableArrays & HashingEasyArrays & Hashing

給定整數陣列 nums,實作 NumArray 類別,支援查詢索引 leftright(含)之間的元素總和。sumRange 會被多次呼叫。

Example:

Input: [“NumArray”, “sumRange”, “sumRange”, “sumRange”] > [[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]] Output: [null, 1, -1, -3]

Intuition

TIP

核心思路:預處理前綴和陣列 prefix[i] = nums[0] + ... + nums[i-1],查詢時 sumRange(l, r) = prefix[r+1] - prefix[l]

Approaches

1. Brute-Force Sum per Query — Init O(1), Query O(n) / O(1)
  • Idea: 每次 sumRange 呼叫時遍歷 [left, right] 區間求和
  • Time: 初始化 O(1),每次查詢 O(n)
  • Space: O(1) - 不需額外空間
class NumArray(private val nums: IntArray) {
    fun sumRange(left: Int, right: Int): Int {
        var sum = 0
        for (i in left..right) {
            sum += nums[i]
        }
        return sum
    }
}
⭐ 2. Prefix Sum — Init O(n), Query O(1) / O(n)
  • Idea: 預處理前綴和陣列,prefix[i] 代表 nums[0..i-1] 的總和,查詢時用差值計算
  • Time: 初始化 O(n),每次查詢 O(1)
  • Space: O(n) - 前綴和陣列
class NumArray(nums: IntArray) {
    private val prefix = IntArray(nums.size + 1)

    init {
        for (i in nums.indices) {
            prefix[i + 1] = prefix[i] + nums[i]
        }
    }

    fun sumRange(left: Int, right: Int): Int {
        return prefix[right + 1] - prefix[left]
    }
}

WARNING

前綴和陣列長度為 n + 1prefix[0] = 0 作為哨兵,避免邊界判斷。

🔑 Takeaways

Ladders 看全部 →

前綴和

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

  1. 1
  2. 2#304Range Sum Query 2D ImmutableMedium二維區間和(容斥)
  3. 3#560Subarray Sum Equals KMedium和為 k 的子陣列數:前綴和 + 雜湊
  4. 4#523Continuous Subarray SumMedium前綴和取模找同餘