給定整數數組 nums,多次查詢區間 [i, j](i ≤ j)的元素和。數組構造後不變。
範例:
nums = [-2, 0, 3, -5, 2, -1]
sumRange(0, 2) → 1
sumRange(2, 5) → -1
sumRange(0, 5) → -3
構造函數中預計算前綴和 sums[k] = nums[0] + ... + nums[k],查詢時:
sumRange(i, j) = sums[j] - (i > 0 ? sums[i-1] : 0)
預處理 O(n),單次查詢 O(1),空間 O(n)。
class NumArray {
public:
NumArray(vector& nums) {
if (nums.empty()) return;
sums.push_back(nums[0]);
for (int i = 1; i < nums.size(); ++i) {
sums.push_back(sums.back() + nums[i]);
}
}
int sumRange(int i, int j) {
if (i == 0) return sums[j];
return sums[j] - sums[i - 1];
}
private:
vector sums;
};
class NumArray:
def __init__(self, nums):
self.sums = [0] * (len(nums) + 1)
for i, num in enumerate(nums):
self.sums[i + 1] = self.sums[i] + num
def sumRange(self, i, j):
return self.sums[j + 1] - self.sums[i]
# 測試
if __name__ == "__main__":
obj = NumArray([-2, 0, 3, -5, 2, -1])
assert obj.sumRange(0, 2) == 1
assert obj.sumRange(2, 5) == -1
assert obj.sumRange(0, 5) == -3
print("測試通過")
sums[i] 存前 i 項和(長度 n+1,sums[0]=0)邊界處理最簡潔前綴和是區間查詢問題的基石技術,掌握其「預處理 + 差分」核心模式,可高效解決大量區間聚合問題。