题目
给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。
实现 NumArray 类:
NumArray(int[] nums) 使用数组 nums 初始化对象
int sumRange(int i, int j) 返回数组 nums 从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点(也就是 sum(nums[i], nums[i + 1], ... , nums[j]))
注:
- 0 <= nums.length <= 104
- -105 <= nums[i] <= 105
- 0 <= i <= j < nums.length
- 最多调用 104 次 sumRange 方法
思路
对于此类多次调用函数的数组类题目,审题后应首先确认数组范围和调用次数
此题我们可以发现:调用次数为104次。
- 首先考虑暴力求解:每次调用函数sumRange时采用循环的方式从下标为left的数开始依次相加,最后输出。但是可以发现每次循环最多可达105,若调用104次sumRange函数,会出现超时现象。
- 选用前缀和的方式:在初始化时建立数组将,对于每一项num[i]记录nums前i项的和,此时占用O(n)。当调用函数sumRange()时,用j项的和减去i-1项的和即可得到部分区域的数组和。应注意左侧边界为0的情况。
代码
class NumArray {
public:
vector<int> num;
NumArray(vector<int>& nums) {
int sum = 0;
int len = nums.size();
for(int i=0;i<len;i++){
sum+=nums[i];
num.push_back(sum);
}
}
int sumRange(int left, int right) {
if(left==0)
return num[right];
return num[right]-num[left-1];
}
};