题目:
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在动态规划的题目里选的一道题。
给一个array,返回的是i到j相加的结果。
提示是:
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(i,j);
*/
就是要写一个类,里面有变量是存了这个array,用这个类的sumRange方法返回这个变量的i到j的和。
咦,这个和动态规划有个啥关系呢。。直接加复杂度不就是O(n)了吗已经。
于是就很快写了代码,直接就通过了:
class NumArray {
public:
NumArray(vector<int> nums) {
numb = nums;
}
int sumRange(int i, int j) {
int sum = 0;
for(int m = i; m <= j; m++){
sum+=numb[m];
}
return sum;
}
vector<int> numb;
};
既然是动态规划里的题目,按道理肯定可以用动态规划的方法。看了一下答案解析,哦原来还可以这样。没有强调NumArray里面要存这个num,那他可以存前m项的和。如果要i到j的和,就用第j个减第i个。是简单的动态规划,而且调用这个函数的复杂度更低了。
代码:
class NumArray {
public:
NumArray(vector<int> &nums) {
accu.push_back(0);
for (int num : nums)
accu.push_back(accu.back() + num);
}
int sumRange(int i, int j) {
return accu[j + 1] - accu[i];
}
private:
vector<int> accu;
};