303. 区域和检索

题意

1.题目很明确,求i,j两点范围内的元素总和。

2.先初始化NumArray类,然后一直调用sumRange()函数。

分析

1.如果再sumRange()函数内用循环写累加,由于会多次调用sumRange()函数,导致超时。

2.用动态规划的思想,在类初始化时用一个新的数组arr来存储累加的结果。

  nums=[-2,0,3,-5,2,-1] 

  arr    =[-2,-2,1,-4,-2,-3]

  这么看来 i,j 区间内元素的和就是arr[j] - arr[i-1]

实现

/**
 * @param {number[]} nums
 */
var NumArray = function(nums) {
    this.arr=[];
    var sum=0;
    for(let i=0;i<nums.length;i++){
        sum+=nums[i];
        this.arr.push(sum);
    }
};

/** 
 * @param {number} i 
 * @param {number} j
 * @return {number}
 */
NumArray.prototype.sumRange = function(i, j) {
    //console.log(this.arr)
    return i===0?this.arr[j]:this.arr[j]-this.arr[i-1];
};

/** 
 * Your NumArray object will be instantiated and called as such:
 * var obj = Object.create(NumArray).createNew(nums)
 * var param_1 = obj.sumRange(i,j)
 */
原文地址:https://www.cnblogs.com/remly/p/10558652.html