zoukankan      html  css  js  c++  java
  • 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列表中。

  • 相关阅读:
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1131 Subway Map (30 分)
    PAT 甲级 1131 Subway Map (30 分)
    AcWing 906. 区间分组 区间贪心
    AcWing 907. 区间覆盖 区间贪心
  • 原文地址:https://www.cnblogs.com/rounie/p/13383708.html
Copyright © 2011-2022 走看看