leetcode-307. Range Sum Query

来源:互联网 发布:淘宝个性主题 编辑:程序博客网 时间:2024/06/03 20:11
  • 一、题目大意:

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

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