题目地址

解题思路

根据题目要求,很容易想到每次都对给定的范围进行累加的操作。代码如下:

代码

  1. /**
  2. * @param {number[]} nums
  3. */
  4. var NumArray = function(nums) {
  5. this.arr = nums;
  6. };
  7. /**
  8. * @param {number} left
  9. * @param {number} right
  10. * @return {number}
  11. */
  12. NumArray.prototype.sumRange = function(left, right) {
  13. let sum = 0;
  14. for(let i = left;i<=right;i++){
  15. if(this.arr[i] !== undefined){
  16. sum += this.arr[i];
  17. }
  18. }
  19. return sum;
  20. };

优化

根据题解,如果是按照上述代码来进行求解,那么每次都要做累加操作。累加的频次比较多,所以优化有的方案是保存一个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];
};

总结

有时计算求和,可以利用数学的方式来计算。