LeetCode-307. 区域和检索 - 数组可修改

题目描述 [区域和检索 - 数组可修改]

给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。

update(i, val) 函数可以通过将下标为 i 的数值更新为 val,从而对数列进行修改。

示例

Given nums = [1, 3, 5]

sumRange(0, 2) -> 9
update(1, 2)
sumRange(0, 2) -> 8

解题思路

  • 用树状数组(下次写个详细的呀)
  • 注意树状数组下标从1开始

代码

class NumArray {
public:
    NumArray(vector& nums) {
        C = vector(nums.size()+1, 0);
        arr = nums;
        for(int i=1;i<=nums.size();i++){
            add(i, nums[i-1]);
        }
    }

    void update(int i, int val) {
        add(i+1, val-arr[i]);
        arr[i] = val;
    }

    int sumRange(int i, int j) {
        return getSum(j+1) - getSum(i);
    }

    void add(int index, int val){
        while(index<=arr.size()){
            C[index] += val;
            index += lowbits(index);
        }
    }

    int getSum(int index){
        int res=0;
        while(index>0){
            res += C[index];
            index -= lowbits(index);
        }
        return res;
    }

    int lowbits(int x){
        return x&(-x);
    }

    vector C;
    vector arr;
};

你可能感兴趣的:(LeetCode-307. 区域和检索 - 数组可修改)