解题思路
根据题目要求,很容易想到每次都对给定的范围进行累加的操作。代码如下:
代码
/**
* @param {number[]} nums
*/
var NumArray = function(nums) {
this.arr = nums;
};
/**
* @param {number} left
* @param {number} right
* @return {number}
*/
NumArray.prototype.sumRange = function(left, right) {
let sum = 0;
for(let i = left;i<=right;i++){
if(this.arr[i] !== undefined){
sum += this.arr[i];
}
}
return sum;
};
优化
根据题解,如果是按照上述代码来进行求解,那么每次都要做累加操作。累加的频次比较多,所以优化有的方案是保存一个sum数组,数组的值就是前n项的和,这样在求解某一个范围时,可以用数学的方式解答出来。代码如下:
var NumArray = function(nums) {
const n = nums.length;
this.sums = new Array(n + 1).fill(0);
for (let i = 0; i < n; i++) {
this.sums[i + 1] = this.sums[i] + nums[i];
}
};
NumArray.prototype.sumRange = function(i, j) {
return this.sums[j + 1] - this.sums[i];
};
总结
有时计算求和,可以利用数学的方式来计算。