欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-13 11:03:19
...
  • 一、题目大意:

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

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

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

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