数组得前缀和

60 阅读1分钟

使用场景

image.png

  1. 一般思路是通过for循环,这样子时间复杂度为O(n)
  2. 使用前缀和技巧,将sumRange函数的时间复杂度降为O(1),说白了就是不要在sumRange里面用 for 循环,核心思路是我们 new 一个新的数组preSum出来,preSum[i]记录nums[0..i-1]的累加和

image.png

/**
 * @param {number[]} nums
 */
var NumArray = function(nums) {
    // preSum[0] = 0,便于计算累加和
    let preSum = new Array(nums.length + 1).fill(0)
    // 计算 nums 的累加和
    for (let i = 1; i < preSum.length; i++) {
        preSum[i] = preSum[i - 1] + nums[i - 1];
    }
    this.preSum = preSum
};

/** 
 * @param {number} left 
 * @param {number} right
 * @return {number}
 */
NumArray.prototype.sumRange = function(left, right) {
     return this.preSum[right + 1] - this.preSum[left]
};