# 303 区域和检索 - 数组不可变

# 题目

给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。

示例:

给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()

sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3

说明:

你可以假设数组不可变。 会多次调用 sumRange 方法。

# 题解

  1. 在 i-j 的范围里,每次相加值。

TIP

执行用时:268 ms, 在所有 JavaScript 提交中击败了 8.67% 的用户
内存消耗:44.5 MB, 在所有 JavaScript 提交中击败了 66.45% 的用户
/**
 * @param {number[]} nums
 */
var NumArray = function(nums) {
    this.nums = nums
};

/** 
 * @param {number} i 
 * @param {number} j
 * @return {number}
 */
NumArray.prototype.sumRange = function(i, j) {
    if(i < 0 || j > this.nums.length ) return 0

    let count = 0

    for(let k=0;k<this.nums.length;k++) {
        if(k>=i && k<= j) {  // 在 i-j 的范围里
            count += this.nums[k]  // 每次叠加值
        }
    }

   return count 
};

/**
 * Your NumArray object will be instantiated and called as such:
 * var obj = new NumArray(nums)
 * var param_1 = obj.sumRange(i,j)
 */
  • 时间复杂度: `O(n)`,使用 for 循环进行遍历
  • 空间复杂度: `O(1)`,使用常数级别的空间
  • 最好情况: i-j 的范围较小,则不用过多相加
  • 最坏情况: i-j 的范围较大,则需要进行多次相加操作
  1. 使用 reduce 来执行相加的操作。这种方式比较慢。

TIP

执行用时:904 ms, 在所有 JavaScript 提交中击败了 5.07% 的用户
内存消耗:48.1 MB, 在所有 JavaScript 提交中击败了 5.21% 的用户
/**
 * @param {number[]} nums
 */
var NumArray = function(nums) {
    this.nums = nums
};

/** 
 * @param {number} i 
 * @param {number} j
 * @return {number}
 */
NumArray.prototype.sumRange = function(i, j) {

    let range = this.nums.slice(i, j+1)

    return range.reduce((prev, current) => prev + current) 
    // 或者
    // return eval(range.join('+')) 
};

/**
 * Your NumArray object will be instantiated and called as such:
 * var obj = new NumArray(nums)
 * var param_1 = obj.sumRange(i,j)
 */
  • 时间复杂度: `O(n)`,使用 reduce 进行遍历
  • 空间复杂度: `O(n)`,使用了一个变量来储存要相加的范围
  • 最好情况: i-j 的范围较小,则不用过多相加
  • 最坏情况: i-j 的范围较大,则需要进行多次相加操作
最后更新时间: 9/14/2020, 10:51:54 PM