• 每日leetcode-数组-303. 区域和检索


    分类:数组-前缀和数组

    题目描述:

    给定一个整数数组  nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。

    实现 NumArray 类:

    NumArray(int[] nums) 使用数组 nums 初始化对象
    int sumRange(int i, int j) 返回数组 nums 从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点(也就是 sum(nums[i], nums[i + 1], ... , nums[j]))
     

    解题思路:

    要求一个区间范围内的数之和,如果采用现找现加的方式,将会导致复杂度跟求和范围紧密相关。

    我们能做的更好的,就是让检索结果的时候,将其复杂度降为常量级,也就是单纯的数学计算。

    所以我们可以先创建一个数组,用来存放从原数组每项累加的和,我们称其为前缀和数组。

    这样,我们可以利用减法,直接得出结果,公式:sumRange(i,j)=sums[j+1]−sums[i]。

     1 class NumArray:
     2 
     3     def __init__(self, nums: List[int]):
     4         self.sums=[0]
     5         _sums = self.sums
     6 
     7         for num in nums:
     8             _sums.append(_sums[-1]+num)
     9 
    10 
    11     def sumRange(self, left: int, right: int) -> int:
    12         _sums=self.sums
    13         return _sums[right+1]-_sums[left]
    14 
    15 
    16 # Your NumArray object will be instantiated and called as such:
    17 # obj = NumArray(nums)
    18 # param_1 = obj.sumRange(left,right)
    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]
    • 时间复杂度:构造函数的时间复杂度是 O(N)O(N), sumRange 函数调用的时间复杂度是 O(1)
    • 空间复杂度:O(N)
  • 相关阅读:
    [置顶] 深入理解android之IPC机制与Binder框架
    cdn加速对门户网站产生的影响
    极客技术专题【007期】:jQuery初学者入门
    linux 下信号处理命令trap && linux下各种信号的意义
    利用ACE 自己实现的线程池
    漫谈开发前奏之编译器
    jar,war,ear区别及java基础杂七八
    java出现no XXX in java.library.path的解决办法及eclipse配置
    Windows下GNU之gcc体验方法
    防asp木马运行
  • 原文地址:https://www.cnblogs.com/LLLLgR/p/14815014.html
Copyright © 2020-2023  润新知