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

  • 一、题目大意:

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

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

  • 二、解题思路:
    此题看起来简单,但是考点并非是我们看来的那样,此题考点使用树状数组
    何为数状数组,就是利用 sum 保存部分节点的和,如下图所示
    leetcode-307. Range Sum Query - Mutable]()_第1张图片

树状数组,关键点在于维护一个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采用了一种类似于二分的方法,每一次值得更新,都需要去更新上面所有相关的,每一次求和,也需要向下求取所有的和。

你可能感兴趣的:(leetcode)