307. Range Sum Query - Mutable
Đề Bài
Given an integer array nums, handle multiple queries of the following types:
- Update the value of an element in
nums. - Calculate the sum of the elements of
numsbetween indicesleftandrightinclusive whereleft <= right.
Implement the NumArray class:
NumArray(int[] nums)Initializes the object with the integer arraynums.void update(int index, int val)Updates the value ofnums[index]to beval.int sumRange(int left, int right)Returns the sum of the elements ofnumsbetween indicesleftandrightinclusive (i.e.nums[left] + nums[left + 1] + ... + nums[right]).
Example 1:
Input ["NumArray", "sumRange", "update", "sumRange"] [[[1, 3, 5]], [0, 2], [1, 2], [0, 2]] Output [null, 9, null, 8] Explanation NumArray numArray = new NumArray([1, 3, 5]); numArray.sumRange(0, 2); // return 1 + 3 + 5 = 9 numArray.update(1, 2); // nums = [1, 2, 5] numArray.sumRange(0, 2); // return 1 + 2 + 5 = 8
Constraints:
1 <= nums.length <= 3 * 104-100 <= nums[i] <= 1000 <= index < nums.length-100 <= val <= 1000 <= left <= right < nums.length- At most
3 * 104calls will be made toupdateandsumRange.
Thuật Toán & Kỹ Thuật
⏱️ Thời gian
O(log n)
💾 Không gian
O(n)
Lời Giải
Python
0307-range-sum-query-mutable.py
class SegmentTree:
def __init__(self, nums):
self.n = len(nums)
self.tree = [0] * 4 * self.n
for idx, val in enumerate(nums):
self.update(1, 0, self.n - 1, idx, val)
def update(self, node, left, right, index, val):
if not left <= index <= right:
return
if left == right:
self.tree[node] = val
return
mid = (left + right) >> 1
self.update(node * 2, left, mid, index, val)
self.update(node * 2 + 1, mid + 1, right, index, val)
self.tree[node] = self.tree[node * 2] + self.tree[node * 2 + 1]
def sumRange(self, node, left, right, qleft, qright):
if qleft > right or left > qright:
return 0
if qleft <= left and right <= qright:
return self.tree[node]
mid = (left + right) >> 1
sumLeft = self.sumRange(node * 2, left, mid, qleft, qright)
sumRight = self.sumRange(node * 2 + 1, mid + 1, right, qleft, qright)
return sumLeft + sumRight
class NumArray:
def __init__(self, nums: List[int]):
self.n = len(nums)
self.it = SegmentTree(nums)
def update(self, index: int, val: int) -> None:
self.it.update(1, 0, self.n - 1, index, val)
def sumRange(self, left: int, right: int) -> int:
return self.it.sumRange(1, 0, self.n - 1, left, right)
# Your NumArray object will be instantiated and called as such:
# obj = NumArray(nums)
# obj.update(index,val)
# param_2 = obj.sumRange(left,right)