
解法:
这里我们采用 前缀和 的解法
啥是前缀和?
前缀和就是我们需要新建一个数组,叫 preNums
preNums[i] 代表着数组 nums 从 0 到 i-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