303. 区域和检索 - 数组不可变
1.题目描述
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
示例:
说明:
1.你可以假设数组不可变。
2.会多次调用 sumRange 方法。
2.思路
求区间 i ~ j 的和,可以转换为 sum[j + 1] - sum[i],其中 sum[i] 为 0 ~ i - 1 的和。
3.代码
class NumArray {
public:
vector<int> sums;
NumArray(vector<int>& nums) {
sums.resize(nums.size()+1);
for(int i = 0;i < nums.size();++i){
sums[i+1] = sums[i] + nums[i];
}
}
int sumRange(int i, int j) {
return sums[j+1] - sums[i];
}
};
/**
* Your NumArray object will be instantiated and called as such:
* NumArray* obj = new NumArray(nums);
* int param_1 = obj->sumRange(i,j);
*/
4.复杂度分析
时间复杂度:O(N),每次查询的时间 O(1),O(N)预计算时间。由于累积和被缓存,每个sumrange查询都可以用 O(1) 时间计算。
空间复杂度:O(N)