您当前的位置: 首页 >  leetcode

孑渡

暂无认证

  • 2浏览

    0关注

    178博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Leetcode】每日一题:区域和检索 - 数组可修改

孑渡 发布时间:2022-04-04 19:09:05 ,浏览量:2

区域和检索 - 数组可修改

给你一个数组 nums ,请你完成两类查询。 其中一类查询要求 更新 数组 nums 下标对应的值 另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和 ,其中 left None: self.sumarray[index // self.size] += val - self.nums[index] self.nums[index] = val def sumRange(self, left: int, right: int) -> int: if left // self.size == right // self.size: return sum(self.nums[left : right + 1]) else: m = self.size b1, b2 = left // m, right // m return sum(self.nums[left: (b1+1) * m]) + sum(self.sumarray[b1 + 1 : b2]) + sum(self.nums[(b2 * m) : right + 1]) 官方代码

class NumArray:
    def __init__(self, nums: List[int]):
        n = len(nums)
        self.n = n
        self.seg = [0] * (n * 4)
        self.build(nums, 0, 0, n - 1)

    def build(self, nums: List[int], node: int, s: int, e: int):
        if s == e:
            self.seg[node] = nums[s]
            return
        m = s + (e - s) // 2
        self.build(nums, node * 2 + 1, s, m)
        self.build(nums, node * 2 + 2, m + 1, e)
        self.seg[node] = self.seg[node * 2 + 1] + self.seg[node * 2 + 2]

    def change(self, index: int, val: int, node: int, s: int, e: int):
        if s == e:
            self.seg[node] = val
            return
        m = s + (e - s) // 2
        if index  int:
        if left == s and right == e:
            return self.seg[node]
        m = s + (e - s) // 2
        if right  m:
            return self.range(left, right, node * 2 + 2, m + 1, e)
        return self.range(left, m, node * 2 + 1, s, m) + self.range(m + 1, right, node * 2 + 2, m + 1, e)

    def update(self, index: int, val: int) -> None:
        self.change(index, val, 0, 0, self.n - 1)

    def sumRange(self, left: int, right: int) -> int:
        return self.range(left, right, 0, 0, self.n - 1)

# 作者:LeetCode-Solution

1、选择分块的思想很自然,但是具体计算出根号能够达到时间空间最优这个思路确实很棒 2、接触到了线段树的概念,python做树的题需要思考一下引用和指针的区别,不然这种涉及到递归的问题容易混乱

关注
打赏
1663211900
查看更多评论
立即登录/注册

微信扫码登录

0.0390s