题目描述 [区域和检索 - 数组可修改]
给定一个整数数组 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<int>& nums) {
C = vector<int>(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<int> C;
vector<int> arr;
};









网友评论