关于线段树的非递归实现
来源:9-6 线段树中的更新操作
iQiuQiuX
2018-11-28
你好,波波老师,关于线段树章节中 leetcode 中的第 307 题 Range Sum Query - Mutable;
使用课程中讲到的线段树能通过,但用时将近 100ms ,排名超过 50% ;
看了下耗时比较短的,与使用 sum 数组的方式类似,使用非递归的树形实现;
请问这样的树是如何构建的,i += (i & -i)
也不是很明白。
代码如下:
public class NumArray {
// 线段树一类题目
private int[] tree,nums;
// m是数组的长度
private int m;
public NumArray(int[] nums) {
m = nums.length;
this.nums = nums;
//m+1是为了便于计算数sum 0
tree = new int[m + 1];
for(int i = 0; i < m; i++) {
updateTree(i + 1, nums[i]);
}
}
//这里是往上面加一些值
public void updateTree(int idx,int val){
for(int i = idx; i <= m; i += (i & -i)) {
tree[i] += val;
}
}
public void update(int i, int val) {
int d = val - nums[i];
nums[i] = val;
updateTree(i + 1,d);
}
public int sum(int idx){
int sum = 0;
for(int i = idx; i > 0; i -= (i & -i)){
sum += tree[i];
}
return sum;
}
public int sumRange(int i, int j) {
return sum(j + 1) - sum(i);
}
}
写回答
1回答
-
这个代码是使用树状数组实现的(英文,Binary Indexed Tree 或者 Fenwick Tree)。树状数组不是这个课程的内容,有兴趣可以在网上查找相关资料进行自学。
加油!:)
012018-11-28
相似问题