# 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 方法。
# 题解
- 在 i-j 的范围里,每次相加值。
TIP
执行用时:268 ms, 在所有 JavaScript 提交中击败了 8.67% 的用户
内存消耗:44.5 MB, 在所有 JavaScript 提交中击败了 66.45% 的用户
内存消耗: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 的范围较大,则需要进行多次相加操作
- 使用 reduce 来执行相加的操作。这种方式比较慢。
TIP
执行用时:904 ms, 在所有 JavaScript 提交中击败了 5.07% 的用户
内存消耗:48.1 MB, 在所有 JavaScript 提交中击败了 5.21% 的用户
内存消耗: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 的范围较大,则需要进行多次相加操作