解题思路
根据题目要求,很容易想到每次都对给定的范围进行累加的操作。代码如下:
代码
/*** @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];
};
总结
有时计算求和,可以利用数学的方式来计算。
