题目:原题链接(中等)
标签:树状数组、线段树
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
---|---|---|---|
Ans 1 (Python) | 构造 = O ( N l o g N ) O(NlogN) O(NlogN) ; 更新 = O ( l o g N ) O(logN) O(logN) ; 查询 = O ( l o g N ) O(logN) O(logN) | O ( N ) O(N) O(N) | 216ms (66.81%) |
Ans 2 (Python) | |||
Ans 3 (Python) |
解法一:
class BIT:
def __init__(self, n: int):
self.n = n
self._tree = [0] * (n + 1)
@staticmethod
def _lowbit(x):
return x & (-x)
def update(self, i: int, x: int):
self.add(i, x - (self.query(i) - self.query(i - 1)))
def add(self, i: int, x: int):
while i <= self.n:
self._tree[i] += x
i += BIT._lowbit(i)
def query(self, i: int) -> int:
ans = 0
while i > 0:
ans += self._tree[i]
i -= BIT._lowbit(i)
return ans
def range_query(self, l: int, r: int) -> int:
return self.query(r) - self.query(l - 1)
class NumArray:
def __init__(self, nums: List[int]):
self.BIT = BIT(len(nums))
for i, n in enumerate(nums):
self.BIT.update(i + 1, n)
def update(self, i: int, val: int) -> None:
self.BIT.update(i + 1, val)
def sumRange(self, i: int, j: int) -> int:
return self.BIT.range_query(i + 1, j + 1)