307 區域和檢索 陣列可修改

2022-05-13 08:55:47 字數 2166 閱讀 3157

給定乙個整數陣列  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 函式的呼叫次數是均勻分布的。

線段樹板子

class

numarray:

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 ...