-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathNumArray.java
106 lines (77 loc) · 2.81 KB
/
NumArray.java
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package leetcode.algo.segment.leet_zh_303;
/*
303. 区域和检索 - 数组不可变
https://leetcode-cn.com/problems/range-sum-query-immutable/
*/
class NumArray {
class SegmentTree {
private int[] data;
private int[] tree;
public SegmentTree(int[] nums) {
data = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
data[i] = nums[i];
}
tree = new int[4 * data.length];
buildSegmentTree(0, 0, data.length - 1);
}
public void buildSegmentTree(int treeIndex, int l, int r) {
if (l == r) {
tree[treeIndex] = data[l];
return;
}
int mid = l + (r - l) / 2;
int leftChildIndex = leftChild(treeIndex);
int rightChildIndex = rightChild(treeIndex);
buildSegmentTree(leftChildIndex, l, mid);
buildSegmentTree(rightChildIndex, mid + 1, r);
tree[treeIndex] = tree[leftChildIndex] + tree[rightChildIndex];
}
public int leftChild(int treeIndex) {
return 2 * treeIndex + 1;
}
public int rightChild(int treeIndex) {
return 2 * treeIndex + 2;
}
public int sumRange(int treeIndex, int l, int r, // 前三个字段全是描述该 treeIndex 对应节点信息
int queryL, int queryR) {
if (l == queryL && r == queryR) {
return tree[treeIndex];
}
int mid = l + (r - l) / 2;
int leftChildIndex = leftChild(treeIndex);
int rightChildIndex = rightChild(treeIndex);
if (queryL > mid) {
return sumRange(rightChildIndex, mid + 1, r, queryL, queryR);
} else if (queryR <= mid) {
return sumRange(leftChildIndex, l, mid, queryL, queryR);
}
int leftChildResult = sumRange(leftChildIndex, l, mid, queryL, mid);
int rightChildResult = sumRange(rightChildIndex, mid + 1, r, mid + 1, queryR);
return leftChildResult + rightChildResult;
}
public int sumRange(int i, int j) {
if (tree == null) {
throw new IllegalArgumentException("Error");
}
return sumRange(0, 0, data.length - 1, i, j);
}
}
private SegmentTree segmentTree = null;
public NumArray(int[] nums) {
if (nums.length > 0) {
segmentTree = new SegmentTree(nums);
}
}
public int sumRange(int i, int j) {
if (segmentTree != null) {
return segmentTree.sumRange(i, j);
}
return 0;
}
}
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(i,j);
*/