leetcode, Range Sum Query - Mutable

class NumArray(object):
    def __init__(self, nums):
        """
        initialize your data structure here.
        :type nums: List[int]
        """
        
        self.nums = [0]*len(nums)
        self.kmp = [0] * ( len(nums)+1 )
        for ind in range(len(nums)):
            self.update( ind, nums[ind] )
            
    def lowbit(self, x):
        return x & (-x)

    def update(self, i, val):
        """
        :type i: int
        :type val: int
        :rtype: int
        """
        Å
        diff = val - self.nums[i]
        self.nums[i] += diff
        
        pos = i+1
        while pos<len(self.kmp):
            self.kmp[pos] += diff
            pos = pos + self.lowbit(pos)

    def sumRange(self, i, j):
        """
        sum of elements nums[i..j], inclusive.
        :type i: int
        :type j: int
        :rtype: int
        """
        
        def summ(n):
            temp, pos = 0, n
            while pos>0:
                temp += self.kmp[pos]
                pos = pos - self.lowbit(pos)
            return temp
        
        if i==0:
            return summ(j+1)
        
        return summ(j+1) - summ(i)
    

# Your NumArray object will be instantiated and called as such:
# numArray = NumArray(nums)
# numArray.sumRange(0, 1)
# numArray.update(1, 10)
# numArray.sumRange(1, 2)

你可能感兴趣的:(LeetCode)