Range Sum Query - Immutable
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
Example:
Given nums = [-2, 0, 3, -5, 2, -1]
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
Note:
You may assume that the array does not change.
There are many calls to sumRange function.
Analysis:
This is a simple DP problem. By just watching the example, we could easily find the solution:
nums = [-2, 0, 3, -5, 2, -1]
For each index i we could compute the sum from 0 to i:
sum = [-2, -2+0, -2+0+3, -2+0+3-5, -2+0+3-5+2, -2+0+3-5+2-1]
Therefore, if we want to find the sum between i and j:
- sum[ i ] can be viewed as sum[ 0 to i ]
- sum[ j ] can be viewed as sum[ 0 to j ]
- sum[ i-1 ] + sum[ i to j ] = s[ 0 to j ]
- sum [ i to j ] = sum[ j ] - sum[ i-1 ]
Code (C++):
class NumArray {
public:
NumArray(vector<int> &nums) {
sums = nums;
for (int i = 1; i< nums.size(); i++){
sums[i] = sums[i-1] + nums[i];
}
}
int sumRange(int i, int j) {
return i==0 ? sums[j] : sums[j] - sums[i-1];
}
private:
vector<int> sums;
};
// Your NumArray object will be instantiated and called as such:
// NumArray numArray(nums);
// numArray.sumRange(0, 1);
// numArray.sumRange(1, 2);
Code (Python):
class NumArray(object):
def __init__(self, nums):
"""
initialize your data structure here.
:type nums: List[int]
"""
self.sums = nums[:]
for i in range(1, len(self.sums)):
self.sums[i] = self.sums[i-1] + nums[i]
def sumRange(self, i, j):
"""
sum of elements nums[i..j], inclusive.
:type i: int
:type j: int
:rtype: int
"""
if i == 0:
return self.sums[j]
else:
return self.sums[j] - self.sums[i-1]
# Your NumArray object will be instantiated and called as such:
# numArray = NumArray(nums)
# numArray.sumRange(0, 1)
# numArray.sumRange(1, 2)
No comments:
Post a Comment