leetcode-307. Range Sum Query - Mutable]()

  • 一、题目大意:

题目简单,给定一个数组,对数组进行更新以及求和
例如:

Given nums = [1, 3, 5]
sumRange(0, 2) -> 9
update(1, 2)
sumRange(0, 2) -> 8

  • 二、解题思路:
    此题看起来简单,但是考点并非是我们看来的那样,此题考点使用树状数组
    何为数状数组,就是利用 sum 保存部分节点的和,如下图所示
    树状数组

树状数组,关键点在于维护一个sums数组,如图所示C,那么这个数组怎么计算呢?关键点在于lowBit()函数,

int lowBit(int x){
    return x&(-x);//返回最高位为1,其他为清0的数据
}
void change(int i, int val) //更新函数
{
    int size = nums.size();
    while (i <= size)
    {
        sums[i] += val;
        i += lowBit(i);
    }
}
int sum(int n)  //求和函数
{
        int sumRes = 0;
        while (n>0)
        {
            sumRes += sums[n];
            n -= lowBit(n);
        }
        return sumRes;
}

其实,在我的理解,在求和的过程中,sum采用了一种类似于二分的方法,每一次值得更新,都需要去更新上面所有相关的,每一次求和,也需要向下求取所有的和。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值