题目描述
给定一个整数数组,计算给定区间中所有数的和。
注意;
- 你可以假设询问过程中数组不会被修改;
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] = \sum_{k=1}^inums[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);
*/