方法一:暴力法
每次调用 sumRange 时,我们都使用for循环将索引 i 到 j 之间的每个元素相加。
class NumArray {
public:
vector<int> vecNums;
NumArray(vector<int>& nums):vecNums(nums) {
}
int sumRange(int i, int j) {
int result = 0;
for(int index = i;index <= j;index++ ){
result += vecNums[index];
}
return result;
}
};
/**
* Your NumArray object will be instantiated and called as such:
* NumArray* obj = new NumArray(nums);
* int param_1 = obj->sumRange(i,j);
*/
复杂度分析:
时间复杂度:每次查询的时间 O(n),每个 sumrange 查询需要 O(n) 时间。
空间复杂度:O(1)。
方法二:缓存
class NumArray {
public:
vector<int> numsVec;
NumArray(vector<int>& nums){
numsVec.push_back(0);
for(int i = 0;i != nums.size();i++){
numsVec.push_back(numsVec[i] + nums[i]);
}
}
int sumRange(int i, int j) {
return numsVec[j + 1] - numsVec[i];
}
};
/**
* Your NumArray object will be instantiated and called as such:
* NumArray* obj = new NumArray(nums);
* int param_1 = obj->sumRange(i,j);
*/
复杂度分析:
每次查询的时间 O(1),O(N) 预计算时间。由于累积和被缓存,每个sumRange查询都可以用 O(1)时间计算。。
空间复杂度:O(1)。
网友评论