LeetCode303. Range Sum Query - Immutable

本文介绍了一种优化区间和查询的方法,通过预计算列表前缀和,显著提高了查询速度。初始思路采用列表切片求和,但效率低下。改进后的方法在初始化时计算并存储前缀和,后续查询只需简单计算即可得到结果。

Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.

Example:

Given nums = [-2, 0, 3, -5, 2, -1]

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

Note:

  1. You may assume that the array does not change.
  2. There are many calls to sumRange function.

思路: 返回列表指定区间的和,最开始的思路很简单,直接利用列表切片求和,不过这种方法因为检测时要多次调用sumRange(),所以速度很慢,要一千多ms.

class NumArray:

    def __init__(self, nums):
        """
        :type nums: List[int]
        """
        self.nums = nums

    def sumRange(self, i, j):
        """
        :type i: int
        :type j: int
        :rtype: int
        """
        return sum(self.nums[i:j+1])

于是换个思路,在列表前n个数的和存储在第n个位置上,这样速度快了很多.

class NumArray:

    def __init__(self, nums):
        """
        :type nums: List[int]
        """
        self.nums = nums
        for i in range(1,len(nums)):
            nums[i] += nums[i-1]
    def sumRange(self, i, j):
        """
        :type i: int
        :type j: int
        :rtype: int
        """
        return self.nums[j]-self.nums[i-1] if i else self.nums[j]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值