RounieJane

leetcode303之区域和检索,数组不可变——动态规划+数组

题目描述:

给定一个整数数组  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 方法。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/range-sum-query-immutable

 

代码实现:

 1 class NumArray:
 2 
 3     def __init__(self, nums):
 4         self.nums = nums
 5 
 6     def sumRange(self, i, j):
 7         return sum(self.nums[i:j + 1])
 8 
 9 
10 print("-------------测试Numarray-----------")
11 nums = [-2, 0, 3, -5, 2, -1]
12 obj = NumArray(nums)
13 print(obj.sumRange(0, 2))
14 
15 
16 class NumArray1:
17 
18     def __init__(self, nums):
19         self.nums = nums
20 
21         self.sums = [0]
22         for i in range(len(nums)):
23             self.sums.append(nums[i] + self.sums[i])
24 
25     def sumRange(self, i, j):
26         return self.sums[j + 1] - self.sums[i]
27 
28 
29 print("-------------测试Numarray1-----------")
30 nums = [-2, 0, 3, -5, 2, -1]
31 obj = NumArray1(nums)
32 print(obj.sumRange(0, 2))

输出:

-------------测试Numarray-----------
1
-------------测试Numarray1-----------
1

总结:方法1,使用切片加求和。因为题目中说明要多次调用sumRange(),故方法1中使用切片方法会增加空间复杂度,不推荐。

方法2,动态依次求出各元素累加之和,然后sumRange()中两元素之差即为索引范围内之和。空间复杂度小。利用append方法将各元素之和依次存入sums列表中。

 

posted on 2020-07-27 09:32  RounieJane  阅读(109)  评论(0编辑  收藏  举报

导航