-
-
Notifications
You must be signed in to change notification settings - Fork 48
Expand file tree
/
Copy path0307-range-sum-query-mutable.py
More file actions
64 lines (49 loc) · 1.95 KB
/
0307-range-sum-query-mutable.py
File metadata and controls
64 lines (49 loc) · 1.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# Build: O(n) time, O(n) space
# Update: O(log n) time
# sumRange: O(log n) time
# Space usage: O(n)
from typing import List
class NumArray:
def __init__(self, nums: List[int]):
self.n = len(nums)
self.segTree = [0 for _ in range(4 * self.n)]
self.buildTree(nums, 0, 0, self.n - 1)
def buildTree(self, nums, nodeIdx, start, end):
if start == end:
self.segTree[nodeIdx] = nums[start]
return
leftIdx = 2 * nodeIdx + 1
rightIdx = 2 * nodeIdx + 2
mid = (start + end) // 2
self.buildTree(nums, leftIdx, start, mid)
self.buildTree(nums, rightIdx, mid + 1, end)
self.segTree[nodeIdx] = self.segTree[leftIdx] + self.segTree[rightIdx]
def update(self, index: int, val: int, nodeIdx = 0, start = 0, end = None) -> None:
if end is None:
end = self.n - 1
if start == end:
self.segTree[nodeIdx] = val
return
mid = (start + end) // 2
leftIdx = 2 * nodeIdx + 1
rightIdx = 2 * nodeIdx + 2
if index <= mid:
self.update(index, val, leftIdx, start, mid)
else:
self.update(index, val, rightIdx, mid + 1, end)
self.segTree[nodeIdx] = self.segTree[leftIdx] + self.segTree[rightIdx]
def sumRange(self, left: int, right: int, nodeIdx = 0, start = 0, end = None) -> int:
if end is None:
end = self.n - 1
if right < start or left > end:
return 0
if left <= start and end <= right:
return self.segTree[nodeIdx]
mid = (start + end) // 2
leftIdx = 2 * nodeIdx + 1
rightIdx = 2 * nodeIdx + 2
return self.sumRange(left, right, leftIdx, start, mid) + self.sumRange(left, right, rightIdx, mid + 1, end)
numArray = NumArray([1, 3, 5])
print(numArray.sumRange(0, 2))
numArray.update(1, 2)
print(numArray.sumRange(0, 2))