題目:
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;
};