Skip to content

Commit c4b261a

Browse files
committed
Create RangeSumQueryMutable.java
1 parent 1f8789e commit c4b261a

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

RangeSumQueryMutable.java

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package leetcode;
2+
3+
import java.util.Arrays;
4+
5+
/**
6+
* Project Name : Leetcode
7+
* Package Name : leetcode
8+
* File Name : RangeSumQueryMutable
9+
* Creator : Leo
10+
* Description : 307. Range Sum Query - Mutable
11+
*/
12+
public class RangeSumQueryMutable {
13+
14+
int[] nums;
15+
int[] tree;
16+
int n;
17+
18+
// time : O(n * logn)
19+
public RangeSumQueryMutable(int[] nums) {
20+
n = nums.length;
21+
tree = new int[n + 1];
22+
this.nums = new int[n];
23+
for (int i = 0; i < n; i++) {
24+
update(i, nums[i]);
25+
}
26+
}
27+
28+
// time : O(logn)
29+
public void update(int i, int val) {
30+
if (n == 0) return;
31+
int diff = val - nums[i];
32+
nums[i] = val;
33+
for (int j = i + 1; j <= n; j += j & (-j)) {
34+
tree[j] += diff;
35+
}
36+
}
37+
38+
// time : O(logn)
39+
public int sumRange(int i, int j) {
40+
return sum(j + 1) - sum(i);
41+
}
42+
43+
private int sum(int k) {
44+
int sum = 0;
45+
for (int i = k; i > 0; i -= i & (-i)) {
46+
sum += tree[i];
47+
}
48+
return sum;
49+
}
50+
51+
/**
52+
* 解法2
53+
*/
54+
//private int[] tree;
55+
//private int[] nums;
56+
57+
public void NumArray(int[] nums) {
58+
this.nums = nums;
59+
int sum;
60+
int lowbit;
61+
tree = new int[nums.length + 1];
62+
for (int i = 1; i < tree.length; i++) {
63+
sum = 0;
64+
lowbit = i & (-i);
65+
for (int j = i; j > i - lowbit; j--) {
66+
sum = sum + nums[j - 1];
67+
}
68+
tree[i] = sum;
69+
}
70+
}
71+
72+
public void update2(int i, int val) {
73+
int diff = val - nums[i];
74+
nums[i] = val;
75+
i++;
76+
for (; i < tree.length; i += (i & (-i))) {
77+
tree[i] += diff;
78+
}
79+
}
80+
81+
public int sumRange2(int i, int j) {
82+
return sum2(j + 1) - sum2(i);
83+
}
84+
85+
private int sum2(int k) {
86+
int sum = 0;
87+
for (int i = k; i > 0; i -= i & (-i)) {
88+
sum += tree[i];
89+
}
90+
return sum;
91+
}
92+
93+
}

0 commit comments

Comments
 (0)