题目描述
给定一个整数数组,计算给定区间中所有数的和。
注意;
- 你可以假设询问过程中数组不会被修改;
sumRange()
会被调用多次;
样例
给定数组:nums = [-2, 0, 3, -5, 2, -1]
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
算法
(前缀和) 初始化:O(n),sumRange:O(1)
初始化时,计算出nums
数组的前缀和。
为了方便处理,我们假设nums
数组下标从1开始。
前缀和 f[i]=∑ik=1nums[k]。
所以 f[j]−f[i−1] 就是区间 [i,j] 中所有数的和。当我们求sumRange(i, j)
时,直接返回 f[j]−f[i−1] 即可。
时间复杂度分析:初始化时需要遍历整个数组,时间复杂度是 O(n);求区间和时只有常数次计算,时间复杂度是 O(1)。
C++ 代码
class NumArray {
public:
vector<int>f;
NumArray(vector<int> nums) {
int n = nums.size();
f = vector<int>(n + 1, 0);
for (int i = 1; i <= n; i ++ ) f[i] = f[i - 1] + nums[i - 1];
}
int sumRange(int i, int j) {
return f[j + 1] - f[i];
}
};
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(i,j);
*/