LeetCode 303:Range Sum Query - Immutable

题目描述

Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
示例如下:

Given nums = [-2, 0, 3, -5, 2, -1]
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3

给定一个整数序列,求指定子序列[i, j]的和sumRange(i, j)。
注:给定一个nums,会调用很多次sumRange(i, j)

解题思路

1、用空间换时间

不是在进行查询的时候累计求和,而是根据给定的nums在调用sumRange(i, j)之前将所有可能的结果计算出来,调用sumRange(i, j)时直接查找结果返回,代码如下:

class NumArray:

    def __init__(self, nums):
        length = len(nums)
        '''
        根据实际情况(j>=i) 使用字典数据结构,将会比二维数组节省一半的空间
        '''
        self.matrix = {}
        for i in range(length):            
            self.matrix[str(i)+str(i)]= nums[i]
        for i in range(length):
            for j in range(i+1,length):
                self.matrix[str(i)+str(j)] = self.matrix[str(i)+str(j-1)] + nums[j]

    
    def sumRange(self, i, j) :
        return self.matrix[str(i)+str(j)]
时间复杂度: 初始化O(n*n) + 查询O(1)
空间复杂度:n*n/2

提交,报错 -_-! Memory Limit Exceeded
空间优化的办法不多了,只能重新整理思路!

2、sumRange(i, j) = sumRange(0, j) – sumRange(i-1, j)

利用加法的结合律,得到从0到当前位置的累加值,查询时,利用上式进行计算,得到sumRange(i, j) ,代码如下:

class NumArray:

    def __init__(self, nums):      
        
        self.nums = nums
        for i in range(1, len(nums)):
            self.nums[i] += nums[i-1]

    
    def sumRange(self, i, j) :      
        if i==0 : return self.nums[j]
        return self.nums[j] - self.nums[i-1]
时间复杂度: 初始化O(n) + 查询O(2)
空间复杂度:n

提交,通过。 ^_^ 收工

    原文作者:左手斧子右手锤
    原文地址: https://www.jianshu.com/p/2fb318589fa0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞