給定乙個整數陣列 nums,求出陣列從索引 i 到 j (i ≤ j) 範圍內元素的總和,包含 i, j 兩點。
update(i, val) 函式可以通過將下標為 i 的數值更新為 val,從而對數列進行修改。
示例:given nums = [1, 3, 5]
sumrange(0, 2) -> 9
update(1, 2)
sumrange(0, 2) -> 8
說明:陣列僅可以在 update 函式下進行修改。
你可以假設 update 函式與 sumrange 函式的呼叫次數是均勻分布的。
線段樹板子
classnumarray:
def__init__
(self, nums: list[int]):
self.n=len(nums)
if self.n==0:return
max_size= 2 ** (int(math.ceil(math.log(self.n, 2))) + 1) - 1self.seg_tree=[0 for i in
range(max_size)]
self.arr=nums
self.biuld_tree(0,0,self.n-1)
defbiuld_tree(self,node,start,end):
if start==end:
self.seg_tree[node]=self.arr[start]
return
mid=(start+end)//2left_node=2*node+1right_node=left_node+1self.biuld_tree(left_node,start,mid)
self.biuld_tree(right_node,mid+1,end)
self.seg_tree[node]=self.seg_tree[left_node]+self.seg_tree[right_node]
def update(self, i: int, val: int) ->none:
defupdate_tree(node,start,end,idx,val):
if start==end:
self.seg_tree[node]=self.arr[idx]=val
return
mid=(start+end)//2left_node=2*node+1right_node=left_node+1
if start<=idx<=mid:
update_tree(left_node,start,mid,idx,val)
else
: update_tree(right_node,mid+1,end,idx,val)
self.seg_tree[node]=self.seg_tree[left_node]+self.seg_tree[right_node]
update_tree(0,0,self.n-1,i,val)
def sumrange(self, i: int, j: int) ->int:
defquery_tree(node,start,end,l,r):
if l>end or rreturn
0
elif l<=start and end<=r:return
self.seg_tree[node]
elif start==end:return
self.seg_tree[node]
mid=(start+end)//2left_node=2*node+1right_node=left_node+1sum_left=query_tree(left_node,start,mid,l,r)
sum_right=query_tree(right_node,mid+1,end,l,r)
return sum_left+sum_right
return query_tree(0,0,self.n-1,i,j)
#your numarray object will be instantiated and called as such:
#obj = numarray(nums)
#obj.update(i,val)
#param_2 = obj.sumrange(i,j)
307 區域和檢索 陣列可修改
超時 leetcode 307.range sum query mutable 使用sum陣列的思路 tle class numarray sum new int nums.length 1 sum 0 0 for int i 1 i nums.length i public int sumrang...
307 區域和檢索 陣列可修改
題目描述 給定乙個整數陣列 nums,求出陣列從索引 i 到 j i j 範圍內元素的總和,包含 i,j 兩點。update i,val 函式可以通過將下標為 i 的數值更新為 val,從而對數列進行修改。示例 given nums 1,3,5 sumrange 0,2 9 update 1,2 s...
LeetCode 307 區域和檢索
給定乙個整數陣列 nums,求出陣列從索引 i 到 j i j 範圍內元素的總和,包含 i,j 兩點。update i,val 函式可以通過將下標為 i 的數值更新為 val,從而對數列進行修改。利用樹狀陣列實現。from typing import class numarray def init ...