leetcode303. 区域和检索 - 数组不可变(Javascript实现)

个人感觉这一题对优化的思维模式锻炼很有帮助,从刷题到实战都有一定借鉴性,值得研究在这里插入图片描述在这里插入图片描述
暴力解法:每次调用sumRange就去遍历数组中i->j并计算总和,缺点在于每一次调用sumRange都要遍历i->,多次调用时效率低。
优化思路(渐进式):1、初始化时先求出所有sumRange的和(每次调用sumRange就只要O(1)时间复杂度,但求出所有sumRange消耗较大),所以此方法有待优化。2、先求出所有前缀和,sumRange的结果只要用前缀和计算一次得出,求前缀和的消耗较小,且sumRange也能做到O(1)时间复杂度,求前缀和不要用双层for循环,用sum累加就可以做到O(n)的时间复杂度(这题优化的主要目的还是解决多次调用重复遍历i->j效率低的问题),此法甚妙
代码如下:

/**
 * @param {number[]} nums
 */
var NumArray = function(nums) {
//初始化处理数组,在这里计算出所有前缀和
// 初始化数组长度为nums.length+1是为了不用处理索引为0的特殊情况,fill(0)是为了初始化数组每一项为Number类型,用于后面计算累加,
this.sum=new Array(nums.length+1).fill(0)
for(let i=0;i<nums.length+1;i++){
    this.sum[i+1]=this.sum[i]+nums[i]
}
};

/** 
 * @param {number} left 
 * @param {number} right
 * @return {number}
 */
NumArray.prototype.sumRange = function(left, right) {
    // 因为求的是包含i,j两点的和,所以left不需要加一
return this.sum[right+1]-this.sum[left]
};
/**
 * Your NumArray object will be instantiated and called as such:
 * var obj = new NumArray(nums)
 * var param_1 = obj.sumRange(left,right)
 */

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Feng Wuqian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值