JS 刷 Leetcode:303. 区域和检索 - 数组不可变

简介: JS 刷 Leetcode:303. 区域和检索 - 数组不可变

1. 题目

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

实现 NumArray 类:

  • NumArray(int[] nums) 使用数组 nums 初始化对象
  • int sumRange(int i, int j) 返回数组 nums 从索引 i 到 j(i ≤ j) 范围内元素的总和,包含 ij 两点(也就是 sum(nums[i], nums[i + 1], ... , nums[j])

 

示例:

输入:
["NumArray", "sumRange", "sumRange", "sumRange"]
[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
输出:
[null, 1, -1, -3]

解释:
NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1)) 
numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))

 

提示:

  • 0 <= nums.length <= 104
  • -105 <= nums[i] <= 105
  • 0 <= i <= j < nums.length
  • 最多调用 104 次 sumRange 方法

2. 解

这道题看上去有点唬人,但其实很简单,就是想求一个数组中第i个位置到第j个位置的和。
当然最朴素的方法就是循环一遍数组求出前i个数的和再循环一遍求出前j个数的和,在相减一下。

当然我们其实可以瞬间想到更好的办法,如果我们在数组初始化的时候,存入数组的不是当前数字,而是前面的和,那么在计算差的时候就可以直接相减了

/**
 * @param {number[]} nums
 */
 var NumArray = function(nums) {
  const len = nums.length
  this.nums = new Array(len).fill(0)
  for(let i = 0; i< len; i++) {
      this.nums[i + 1] = this.nums[i] + nums[i]
  }
};

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

image.png

复杂度分析

  • 时间复杂度:初始化 O(n),每次检索 O(1)
  • 空间复杂度: O(n)
相关文章
|
17小时前
|
JavaScript 索引
JS判断数组是否包含某个元素
JS判断数组是否包含某个元素
6 1
|
3天前
|
存储 JavaScript 前端开发
JavaScript中的数组是核心数据结构,用于存储和操作序列数据
【6月更文挑战第22天】JavaScript中的数组是核心数据结构,用于存储和操作序列数据。创建数组可以使用字面量`[]`或`new Array()`。访问元素通过索引,如`myArray[0]`,修改同样如此。常见方法包括:`push()`添加元素至末尾,`pop()`移除末尾元素,`shift()`移除首元素,`unshift()`添加到开头,`join()`连接为字符串,`slice()`提取子数组,`splice()`进行删除、替换,`indexOf()`查找元素位置,`sort()`排序数组。还有其他如`reverse()`、`concat()`等方法。
12 2
|
4天前
|
JavaScript 前端开发
记录Javascript数组类练习
记录Javascript数组类练习
9 1
|
8天前
|
JavaScript 前端开发 数据处理
【JavaScript】JavaScript数组全方位探索指南:深入理解数组特性
【JavaScript】JavaScript数组全方位探索指南:深入理解数组特性
11 1
|
11天前
|
JavaScript 前端开发 索引
深入了解JavaScript中的indexOf()方法:实现数组元素的搜索和索引获取
深入了解JavaScript中的indexOf()方法:实现数组元素的搜索和索引获取
|
11天前
|
C++ Python
二刷力扣--数组
二刷力扣--数组
|
12天前
|
索引
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
|
12天前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
14天前
|
JavaScript 前端开发 索引
JavaScript基础-数组操作:增删改查
【6月更文挑战第11天】本文介绍了JavaScript数组的增删改查操作,包括查询(索引访问、indexOf、lastIndexOf、includes)、修改(直接赋值、splice)、添加(push、unshift、splice)和删除(pop、shift、splice)。同时,文章列举了三个易错点:数组越界、splice参数理解不清及修改原数组与返回值混淆,并提供了相应的避免策略。通过代码示例展示了各种操作的用法,强调理解方法特性和实践的重要性,以提升数组操作效率。
|
16小时前
|
JavaScript 索引
JS数组常用方法总结,含ES6新方法,附示例代码
JS数组常用方法总结,含ES6新方法,附示例代码