原题如下:
Given an integer array nums, find the sum of the elements between indicesi and j (i ≤ j), inclusive.
Example:
Given nums = [-2, 0, 3, -5, 2, -1]
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
Note:
- You may assume that the array does not change.
- There are many calls to sumRange function.
大意就是:给定一个数组,找到下标i和j之间的所有元素的和,其中要注意的一点就是求和函数可能被多次调用。
解题思路:关于这道题目,如果不考虑多次调用的情况下,我们可以直接用一个循环算出结果即可,简单粗暴。但是如果多次调用的话,每次都用循环算一遍,这样就比较麻烦了,如果我们能够保留前n项的和,这样就很简便了,计算i到j之间的和,则直接用前j项的和减去第i-1项的和,这样复杂性就较少了很多。
算法:
1、 在类里面增加一个sum数组;
2、 在构造函数中用一个循环求出数组的前i项和,并将数据存入到sum中;
3、 然后如果我们要求i和j之间的所有元素的和,直接用sum[j]-sum[i-1]即可。
算法复杂度分析:这样只需要在构造函数里面用一个循环求数组的前i项和即可,算法复杂度为O(n)。
具体代码如下:
class NumArray {
public:
NumArray(vector<int> &nums) {
int n=nums.size();
for(int i=0;i<n;++i){
sum.push_back(nums[i]);
}
for(int i=0;i<n-1;++i){
sum[i+1]+=sum[i];
}
}
public:
NumArray(vector<int> &nums) {
int n=nums.size();
for(int i=0;i<n;++i){
sum.push_back(nums[i]);
}
for(int i=0;i<n-1;++i){
sum[i+1]+=sum[i];
}
}
int sumRange(int i, int j) {
if(i<0||j<0||i>=sum.size()||j>=sum.size()||i>j)return 0;
return i==0?:sum[i],sum[j]-sum[i-1];
}
private:
vector<int> sum;
};
if(i<0||j<0||i>=sum.size()||j>=sum.size()||i>j)return 0;
return i==0?:sum[i],sum[j]-sum[i-1];
}
private:
vector<int> sum;
};