303. 区域和检索——数组不可变(Python)

题目

难度:★☆☆☆☆
类型:数组

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

说明:
你可以假设数组不可变。
会多次调用 sumRange 方法。

示例

给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()

sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3

解答

正常情况下,我们的思路是这样的:

class NumArray(object):
    def __init__(self, nums):
        """
        :type nums: List[int]
        """
        self.nums = nums

    def sumRange(self, i, j):
        """
        :type i: int
        :type j: int
        :rtype: int
        """
        return sum(self.nums[i:j + 1])

这种办法提交可以跑通,但是耗时很长。如果我们注意到了“说明”中的提示,就可以考虑使用一种记忆化的方式,以避免如上大量重复计算。

这里,我们在实例化数组类(NumArray)时,就对输入数组nums进行处理,我们准备一个新的数组sums,用于存储到输入数组某一位置为止之前的所有数的和,即:
sums[i] = sum(nums[0:i+1]), (0 <= i <= i+1, nums[0]=0)
因此sums数组的长度要比nums大1

我们想要求出从nums中从i到j(包括j)在内的所有数的和,通过sums中两个元素相减即可轻易获得:

sum(nums[i:j+1]) = sums[j+1] - sum[i]

编码实现如下:

class NumArray(object):
    def __init__(self, nums):
        """
        :type nums: List[int]
        """
        # self.nums = nums
        self.sums = []
        cur_sum = 0
        self.sums.append(cur_sum)               # 加入第0个数
        for num in nums:                        # 遍历数组中每个数
            cur_sum += num                      # 到当前为止的数组和
            self.sums.append(cur_sum)           # 添加到列表中

    def sumRange(self, i, j):
        """
        :type i: int
        :type j: int
        :rtype: int
        """
        return self.sums[j+1] - self.sums[i]    # 返回下标为j+1与下标为i的差值即可


if __name__ == "__main__":
    # 测试一下
    n = NumArray([-2, 0, 3, -5, 2, -1])
    print(n.sumRange(0, 2))
    print(n.sumRange(2, 5))
    print(n.sumRange(0, 5))

如有疑问或建议,欢迎评论区留言~

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容