• 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列表中。

  • 相关阅读:
    CI框架 QQ接口(第三方登录接口PHP版)
    linux定时任务的设置
    WEB服务器:Apache、Tomcat、JBoss、WebLogic、Websphere、IIS的区别与关系
    php专业面试总结
    php常用数学函数
    UVA 1428 Ping pong
    UVA 11988 Broken Keyboard (a.k.a. Beiju Text)
    UVA 11991 Easy Problem from Rujia Liu?
    UVA 11995 I Can Guess the Data Structure!
    UVA 10375 Choose and divide
  • 原文地址:https://www.cnblogs.com/rounie/p/13383708.html
Copyright © 2020-2023  润新知