LeetCode-303. 区域和检索 - 数组不可变(JavaScript)

251 阅读1分钟

题目链接:leetcode-cn.com/problems/ra…

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/72f1b79e6810481db7c9c056bc261435~tplv-k3u1fbpfcp-zoom-1.image

解法:

这里我们采用 前缀和 的解法

啥是前缀和?

前缀和就是我们需要新建一个数组,叫 preNums

preNums[i] 代表着数组 nums0i-1 的值的和

nums:       [2, -6,  3, 7, -1]

preNums:[0,  2, -4, -1, 6,  5]

preNums 在初始化的时候,第一个值为 0

preNums[i] = nums[i-1] + preNums[i-1]

前缀和能干啥?

前缀和的作用就是:帮助我们取得一个数组中,任意区间的值的和

nums[left]nums[right] 闭区间内的值 = preNums[right+1] - preNums[left]

推导方法

  • 数组从 0 到 left 的和为 x
  • 数组从 0 到 right 的和为 y
  • 数组从 left 到 right 的和为 y - x + nums[left]
  • nums[left] = preNums[left+1] - preNums[left]
  • nums[left] . . . nums[right] = y - x + nums[left] = preNums[right+1] - preNums[left+1] + nums[left] = preNums[right+1] - preNums[left]

这题就很好做了

先构造前缀和数组

然后通过preNums[right+1] - preNums[left] 得出区间内的和

/*
 * @lc app=leetcode.cn id=303 lang=javascript
 *
 * [303] 区域和检索 - 数组不可变
 */

// @lc code=start
/**
 * @param {number[]} nums
 */
var NumArray = function (nums) {
  
  // 构造前缀和数组
  let preNums = [0]; // 第一个值初始化为 0
  for (let i = 1; i <= nums.length; i++) {
    preNums[i] = nums[i - 1] + preNums[i - 1];
  }
	// 将 preNums 挂载到 NumArray 上
  this.preNums = preNums;
};

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

/**
 * Your NumArray object will be instantiated and called as such:
 * var obj = new NumArray(nums)
 * var param_1 = obj.sumRange(left,right)
 */
// @lc code=end