307. Range Sum Query - Mutable

位运算

运算 含义
x>>1 右移一位,x /= 2
x<<1 左移一位,x *= 2
`x 1` 或,如果x = 2*i,那么`x 1` = 2*i +1
x^1 异或,奇偶互换
x&1 是否为奇数,x%2

线段树

segment tree

原型是二叉树,叶子节点是数组元素,非叶子节点代表一段序列的和

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class NumArray {
int[] array;
int n;
public NumArray(int[] nums) {
n = nums.length;
array = new int[2*n];
//init leaves
for(int i = 0; i < nums.length; i++){
array[n+i] = nums[i];
}
//init node
for(int i = n - 1; i >= 0; i--){
array[i] = array[i << 1] + array[i << 1 | 1];
}
}
void update(int i, int val) {
array[i+n] = val;
for(int j = i+n; j > 0; j >>= 1){
array[j >> 1] = array[j] + array[j ^ 1];
}
}
public int sumRange(int i, int j) {
int sum = 0;
for(int l = i+n, r = j+n; l < r; l >>= 1 , r >>= 1){
//if left is right child, sum does not contain parent
if((l&1) == 1){
sum += array[l++];
}
if((r&1) == 1){
sum += array[--r];
}
}
return sum+array[j+n];
}
}