Range Sum Query - Mutable
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
The update(i, val) function modifies nums by updating the element at index i to val . Example:
Given nums = [1, 3, 5] sumRange(0, 2) -> 9 update(1, 2) sumRange(0, 2) -> 8
Note:
- The array is only modifiable by the update function.
- You may assume the number of calls to update and sumRange function is distributed evenly.
使用数组实现更新与查询都是log n 的复杂度
代码:
class NumArray {
public:
vector<int>num;
vector<int>bit;
void update(int i, int val) {
int diff=val-num[i+1];
for (int j=i+1; j<bit.size(); j+=(j&(-j)))
{
bit[j]+=diff;
}
num[i+1]=val;
return ;
}
NumArray(vector<int> nums) {
num.resize(nums.size()+1,0);
bit.resize(nums.size()+1,0);
for (int i=0; i<nums.size(); i++)
{
update(i,nums[i]);
}
}
int GetSum(int i)
{
int ans=0;
for (int j=i; j>0; j-=(j&(-j)))
{
ans+=bit[j];
}
return ans;
}
int sumRange(int i, int j) {
return GetSum(j+1)-GetSum(i);
}
};
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* obj.update(i,val);
* int param_2 = obj.sumRange(i,j);
*/