Leetcode 307. Range Sum Query - Mutable (Python)

题目大意

构建一个数据结构,共有两种操作方式

  • sumRange(i,j):计算[i,j]范围内数组和
  • update(i,val):将位于数组坐标i的元素值改为val

算法

使用线段树即可

代码

class Segment_Tree(object):
    def add(self,start,end,llist):
        self.start = start
        self.end = end
        self.middle = (start+end)/2
        self.num = 0

        if self.start + 1 == self.end:
            self.num = llist[self.start]
            return self.num
        else:
            left = Segment_Tree()
            self.left = left
            self.num += left.add(start,self.middle,llist)

            right = Segment_Tree()
            self.right = right
            self.num += right.add(self.middle,end,llist)

            return self.num

    def update(self,index,num):
        if self.start == index and self.start + 1 == self.end:
            cha = num - self.num
            self.num = num
            return cha

        if index >= self.middle:
            cha = self.right.update(index,num)
            self.num += cha
            return cha
        else:
            cha = self.left.update(index,num)
            self.num += cha
            return cha

    def sum(self,start,end):
        if start == self.start and end == self.end:
            return self.num


        if end <= self.middle:
            return self.left.sum(start,end)
        elif start>= self.middle:
            return self.right.sum(start,end)
        else:
            left_val = self.left.sum(start,self.middle)
            right_val = self.right.sum(self.middle,end)

            return left_val + right_val


class NumArray(object):
    def __init__(self, nums):
        """
        initialize your data structure here.
        :type nums: List[int]
        """

        if len(nums) == 0:
            nums.append(0)

        self.nums = nums
        self.st = Segment_Tree()
        self.st.add(0,len(self.nums),self.nums)



    def update(self, i, val):
        """
        :type i: int
        :type val: int
        :rtype: int
        """
        self.st.update(i,val)
        return val


    def sumRange(self, i, j):
        """
        sum of elements nums[i..j], inclusive.
        :type i: int
        :type j: int
        :rtype: int
        """
        return self.st.sum(i,j+1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值