给定一个整数数组 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 方法。
第一种思路:
二维打表法。
简单粗暴,但是会卡在最后一个test case上,内存不够用。
class NumArray(object):
    def __init__(self, nums):
        """
        :type nums: List[int]
        """
        m = len(nums)
        n = m
        self.dp =[[[0] for _ in range(m)] for i in range(n)]
        
        for i in range(0, m):
            self.dp[i][i] = nums[i]
        
        for i in range(m):
            for j in range(i + 1,n):
                self.dp[i][j] = self.dp[i][j - 1] + nums[j]
    def sumRange(self, i, j):
        """
        :type i: int
        :type j: int
        :rtype: int
        """
        return self.dp[i][j]
        
# Your NumArray object will be instantiated and called as such:
# obj = NumArray(nums)
# param_1 = obj.sumRange(i,j)第二种思路:
优化一下,其实一维打表就够了,用 dp[i] 储存 0 – i 的元素之和,如果求 i – j 的元素之和,就返回dp[j] – dp[i – 1]即可。
class NumArray(object):
    def __init__(self, nums):
        """
        :type nums: List[int]
        """
        if not nums:
            return None
        m = len(nums)
        n = m
        self.dp = [0 for _ in range(m)]
        
        self.dp[0] = nums[0]
        
        for i in range(1, m):
            self.dp[i] = self.dp[i - 1] + nums[i]
        
        # print self.dp
        
    
    def sumRange(self, i, j):
        """
        :type i: int
        :type j: int
        :rtype: int
        """
        if i == 0:
            return self.dp[j]
        else:
            return self.dp[j] - self.dp[i - 1]
        
# Your NumArray object will be instantiated and called as such:
# obj = NumArray(nums)
# param_1 = obj.sumRange(i,j)
版权声明:本文为qq_32424059原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
