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

  • 相关阅读:
    大并发服务器开发(实战)
    [亲测有效]Ubuntu20.04安装ROS1和ROS2
    Linux多进程开发(二)
    Linux网络编程(四 )
    统计当前系统的TCP连接状态的种类以及对应的个数
    Linux系统编程入门(一)
    gdb与core 最有效的调试手段之一
    Port was alread in use
    Nginx实现统一端口反向代理多个服务
    Windows Terminal打开管理员权限的PowerShell
  • 原文地址:https://www.cnblogs.com/rounie/p/13383708.html
Copyright © 2020-2023  润新知