###### tags: `Leetcode` `easy` `design` `prefix sum` `array` `python` `c++` # 303. Range Sum Query - Immutable ## [題目連結:] https://leetcode.com/problems/range-sum-query-immutable/description/ ## 題目: ![](https://i.imgur.com/AKOmuTN.png) ![](https://i.imgur.com/LHyb7VB.png) ## 解題想法: * 此題為設計實做一個NumArray類別,使用sumRange(i, j) 時要能夠回傳[i, j]範圍內的和 * prefix sum前綴和想法 * self.nums紀錄原本的數組 * self.sumArray紀錄從頭到nums[i]的和 * 最終 self.sumArray[right]-self.sumArray[left]+self.nums[left]即為解 ``` python= ex: nums =[-2, 0, 3, -5, 2, -1] self.nums =[-2, 0, 3, -5, 2, -1] self.sumArray=[-2,-2, 1, -4,-2, -3] sumRange(2,5)= (-3)-(1)+3= -1 ``` ## Python: ``` python= class NumArray(object): def __init__(self, nums): """ :type nums: List[int] """ self.nums=list(nums) self.sumArray=list(nums) for i in range(1,len(nums)): #prefix sum self.sumArray[i]+=self.sumArray[i-1] def sumRange(self, left, right): """ :type left: int :type right: int :rtype: int """ return self.sumArray[right]-self.sumArray[left]+self.nums[left] if __name__ == '__main__': result = NumArray(nums= [-2, 0, 3, -5, 2, -1]) ans = result.sumRange(2, 5) print(ans) ``` ## C++: ``` cpp= class NumArray { public: NumArray(vector<int>& nums) { copy=nums; sumArray=nums; for (int i=1; i<nums.size(); i++){ sumArray[i]+=sumArray[i-1]; } } int sumRange(int left, int right) { return sumArray[right]-sumArray[left]+copy[left]; } private: vector<int> copy; vector<int> sumArray; }; /** * Your NumArray object will be instantiated and called as such: * NumArray* obj = new NumArray(nums); * int param_1 = obj->sumRange(left,right); */ ```