区域和检索-数组可修改的思路探讨与源码
区域和检索-数组可修改的题目如下图,该题属于数组类和树类型的题目,主要考察对于数组搜索方法的使用和树结构方法的理解。本文的题目作者想到2种方法,分别是树状数组搜索方法和线段树方法,其中树状数组搜索方法使用Java进行编写,而线段树方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
本人认为该题目可以使用树状数组搜索方法的思路进行解决,首先计算数组的长度并初始化数组,然后对数组进行搜索,按照区间的容斥原理查询1到当前位置的和是多少,并最终返回查询的结果。那么按照这个思路我们的Java代码如下:
#喷火龙与水箭龟
class NumArray {
int[] arr;
int[] nums;
int n;
int lowFun(int x) {
return x & -x;
}
void add(int x, int u) {
for (int ir = x; ir <= n; ir = ir + lowFun(ir)){
arr[ir] = arr[ir] + u;
}
}
int query(int x) {
int ans = 0;
for (int iz = x; iz > 0; iz = iz - lowFun(iz)){
ans = ans + arr[iz];
}
return ans;
}
public Nu