Leetcode-Algorithm-DP-303
-
题目:
-
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
(给定一个整型数组nums,计算索引i和j之间,包含所以i和j,所有元素的和。)
例子:
给定:
nums = [-2, 0, 3, -5, 2, -1]。
结果:
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
题解:
方法1:(直接计算)
该方法没有什么技术水平,就是直接计算给定的索引之间的元素的和即可。
class NumArray {
private:
vector<int> datas;
public:
NumArray(vector<int> nums) {
for (auto n : nums)
datas.push_back(n);
}
int sumRange(int i, int j) {
int sum = 0;
for (int ix = i; ix <= j; ++ix)
sum += datas[ix];
return sum;
}
};
分析:
除了构造对象时需要遍历一次数组来存储元素外,由于每次调用sumRange都要遍历一次数组,因此时间复杂度为
O(n)
。
方法2:(动态规划)
计算i和j之间(包含i和j)所有元素的和相当于计算前j个元素的总和以及前i个元素的总和,然后把结果相减即可。需要注意的是i和j都是包含在内的,所以计算前j个元素的和需要包括j,而计算前i个元素的和不需要包括i。
class NumArray {
private:
vector<int> sums;
public:
NumArray(vector<int> nums) : sums(nums.size()+1, 0) {
partial_sum(nums.begin(), nums.end(), sums.begin()+1);
}
int sumRange(int i, int j) {
return sums[j+1] - sums[i];
}
};
分析:
除了在构造对象时需要遍历一次数组来存储所有包含当前索引之间的元素的和之外,一旦所有的和都计算完后,剩下每次调用sumRange只需要计算对应索引下总和之差即可。因此,调用sumRange的时间复杂度仅为
O(1)
。