Range Sum Query - Mutable

本文介绍了一种使用段树数据结构实现动态数组区间求和和更新的方法。通过构建段树,可以高效地进行区间求和和单点更新操作,避免了传统遍历求和的效率低下。文章详细解释了段树的构建、查询和更新过程,并提供了完整的Python代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class SegmentTreeNode(object):
    def __init__(self, start, end):
        self.start = start
        self.end = end
        self.sum = 0
        self.left = None
        self.right = None
        
class NumArray(object):
    def __init__(self, nums):
        """
        initialize your data structure here.
        :type nums: List[int]
        """
        n = len(nums)
        self.root = self.buildTree(nums, 0, n-1)
        

    def update(self, i, val):
        """
        :type i: int
        :type val: int
        :rtype: int
        """
        self.modifyTree(i,val, self.root)
        

    def sumRange(self, i, j):
        """
        sum of elements nums[i..j], inclusive.
        :type i: int
        :type j: int
        :rtype: int
        """
        return self.queryTree(i, j, self.root)
        
    def buildTree(self, nums, start, end):
        if start > end: return None#not valid
        root = SegmentTreeNode(start, end)
        if start == end:
            root.sum = nums[start]
            return root
        mid = start + (end - start)/2
        root.left = self.buildTree(nums, start, mid)
        root.right = self.buildTree(nums, mid+1, end)
        root.sum = root.left.sum + root.right.sum
        return root
        
    def modifyTree(self, i, val, root):
        if not root:
            return 0
        if root.start==i and root.end == i: 
            diff = val - root.sum
            root.sum = val
            return diff
        mid = (root.start + root.end)/2
        if i > mid:
            diff = self.modifyTree(i, val, root.right)
        else:
            diff = self.modifyTree(i, val, root.left)
        root.sum = root.sum + diff
        return diff
        
    def queryTree(self, i, j, root):
        if not root:
            return 0
        if root.start == i and root.end == j:
            return root.sum
        mid = (root.start + root.end)/2
        if i > mid:
            return self.queryTree(i, j, root.right)
        if j <= mid:
            return self.queryTree(i, j, root.left)
            
        return self.queryTree(i, mid, root.left)+self.queryTree(mid+1, j , root.right)
        
        

# Your NumArray object will be instantiated and called as such:
# numArray = NumArray(nums)
# numArray.sumRange(0, 1)
# numArray.update(1, 10)
# numArray.sumRange(1, 2)

 

转载于:https://www.cnblogs.com/sherylwang/p/5912620.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值