#Question
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
The update(i, val) function modifies nums by updating the element at index i to val.
Example:
Given nums = [1, 3, 5]
sumRange(0, 2) -> 9
update(1, 2)
sumRange(0, 2) -> 8
Note:
The array is only modifiable by the update function.
You may assume the number of calls to update and sumRange function is distributed evenly.
Hide Tags Segment Tree Binary Indexed Tree
Hide Similar Problems (E) Range Sum Query - Immutable (H) Range Sum Query 2D - Mutable
My Solution
Accept
KMP algorithm
Time complexity:
Update
O(nlogn)
SumRange
O(nlogn)
space complexity: O(n)
class NumArray(object):
def __init__(self, nums):
"""
initialize your data structure here.
:type nums: List[int]
"""
self.nums = nums
self.kmp = [0] * ( len(nums)+1 )
for ind in range(1,len(self.kmp)):
how_many = self.lowbit( ind ) - 1
self.kmp[ind] += nums[ind-1]
pos = ind - 1
while how_many>0:
self.kmp[ind] += self.kmp[pos]
how_many -= self.lowbit( pos )
pos -= self.lowbit( pos )
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] = val
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)