区域和检索 - 数组可修改
难度:中等
题目看似简单,但模拟暴力解的话会TLE,看了题解学会了树状数组,不了解树状数组的小伙可以学习下【算法讲堂】【电子科技大学】【ACM】树状数组与ST表,其实理解了树状数组这道题就不难了,而且有固定模板,直接套就行了。
代码如下:
public class RangeSumQueryMutable {
int[] tree;
int[] nums;
int n;
int lowbit(int x){
return x&-x;
}
void add(int index,int u){
while(index<=n){
tree[index] += u;
index += lowbit(index);
}
}
int query(int index){
int res = 0;
while (index>0){
res += tree[index];
index -= lowbit(index);
}
return res;
}
public RangeSumQueryMutable(int[] _nums) {
nums = _nums;
n = _nums.length;
tree = new int[n+1];
for (int i = 0; i < n; i++) {
add(i+1,nums[i]);
}
}
public void update(int index, int val) {
add(index+1,val-nums[index]);
nums[index] = val;
}
public int sumRange(int left, int right) {
return query(right+1)-query(left);
}
}
执行结果:成功