题目
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.
题意
给你一个数组,输出下标i 到 j 的连续之和。
题解
累加法求和,时间复杂度为0(n)
累加法的过程:根据题意所给的例子
nums = [-2, 0, 3, -5, 2, -1]
累加求和
dp[0] = -2
dp[1] = -2
dp[2] = 1
dp[3] = -4
dp[4] = -2
dp[5] = -3
sumRange(0, 2) = dp[2]
sumRange(2, 5) = dp[5] - dp[1]
sumRange(0, 5) = dp[5]
即动态转换方程为:
i == 0 sumRange(i, j) = dp[j]
i != 0 sumRange(i, j) = d[j] - dp[i-1]
C++代码
class NumArray {
private: vector<int> dp;
public:
NumArray(vector<int> nums) {
int len = nums.size();
if(len>0){
dp.push_back(nums[0]);
for(int i=1; i<len; i++)
dp.push_back(dp[i-1] + nums[i]);
}
}
int sumRange(int i, int j) {
if(i==0) return dp[j];
return dp[j] - dp[i-1];
}
};
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(i,j);
*/
python代码
class NumArray(object):
def __init__(self, nums):
"""
:type nums: List[int]
"""
self.dp = [0 for x in range(len(nums))]
dp = self.dp
if len(nums)>0:
dp[0] = nums[0]
for i in range(1, len(nums)):
dp[i] = dp[i-1] + nums[i]
def sumRange(self, i, j):
"""
:type i: int
:type j: int
:rtype: int
"""
if i==0:
return self.dp[j]
return self.dp[j] - self.dp[i-1]