题目信息:
给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。
例:
输入:
[“NumArray”, “sumRange”, “sumRange”, “sumRange”]
[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
输出:
[null, 1, -1, -3]
本人思路:
使用列表切片i,j+1,然后使用sum求和。
成功提交,然执行时间太长。内置方法如此耗时是我没想到的。
class NumArray:
def __init__(self, nums):
self.nums = nums
def sumRange(self, i, j):
return sum(self.nums[i:j + 1])
参考思路:
先求出列表到每个索引的和的列表,再用 j+1 位置的和减去 i 位置的和。
第二次提交的执行时间就是这个代码的执行时间,快到可怕。
class NumArray:
def __init__(self, nums: List[int]):
N = len(nums)
self.preSum = [0] * (N + 1)
for i in range(N):
self.preSum[i + 1] = self.preSum[i] + nums[i]
def sumRange(self, i: int, j: int) -> int:
return self.preSum[j + 1] - self.preSum[i]
实测得知:
先定义presum为空列表,后使用append追加值,耗时仍很高。按大神写法,先定义数组,用0占位,后修改元素的值耗时较小,此处不解。望大神在下方评论解惑,不胜感激。
注:
题目来源:力扣(LeetCode)
参考大神:负雪明烛