給定一個整數(shù)數(shù)組 nums蚣抗,處理以下類型的多個查詢:
計算索引 left 和 right (包含 left 和 right)之間的 nums 元素的 和 ,其中 left <= right
實現(xiàn) NumArray 類:
NumArray(int[] nums) 使用數(shù)組 nums 初始化對象
int sumRange(int i, int j) 返回數(shù)組 nums 中索引 left 和 right 之間的元素的 總和 碘箍,包含 left 和 right 兩點(也就是 nums[left] + nums[left + 1] + ... + nums[right] )
輸入:
["NumArray", "sumRange", "sumRange", "sumRange"]
[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
輸出:
[null, 1, -1, -3]
解釋:
NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1))
numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))
Python
最樸素的想法是存儲數(shù)組 nums 的值,每次調(diào)用 sumRange 時虑瀑,通過循環(huán)的方法計算數(shù)組 nums 從下標 i 到下標 j 范圍內(nèi)的元素和馆纳,需要計算 j?i+1 個元素的和。由于每次檢索的時間和檢索的下標范圍有關糠亩,因此檢索的時間復雜度較高虐骑,如果檢索次數(shù)較多准验,則會超出時間限制。
由于會進行多次檢索廷没,即多次調(diào)用sumRange糊饱,因此為了降低檢索的總時間,應該降低 sumRange 的時間復雜度腕柜,最理想的情況是時間復雜度 O(1)济似。為了將檢索的時間復雜度降到 O(1),需要在初始化的時候進行預處理盏缤。
class NumArray:
def __init__(self, nums: List[int]):
self.sums = [0]
_sums = self.sums
for num in nums:
_sums.append(_sums[-1] + num)
def sumRange(self, i: int, j: int) -> int:
_sums = self.sums
return _sums[j + 1] - _sums[i]