-
Notifications
You must be signed in to change notification settings - Fork 0
/
307.range-sum-query-mutable.java
121 lines (107 loc) · 3.6 KB
/
307.range-sum-query-mutable.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// class NumArray {
// int height;
// int maxsize;
// int[] segtree;
// int arrlen;
// public NumArray(int[] nums) {
// height = (int)(Math.celi(Math.log(nums.length)/Math.log(2)));
// maxsize = 2 * (int)Math.pow(2, height)-1;
// segtree = new int[maxsize];
// arrlen = nums.length-1;
// buildTree(nums, 0, arrlen, 0);
// }
// public void update(int index, int val) {
// int upddif = val - nums[index];
// nums[index] = val;
// updatenew(index, val, updiff, 0, );
// }
// public int sumRange(int left, int right) {
// return sum(left, right, 0, arrlen, 0);
// }
// public int sum(int l, int r, int s,int e, int c){
// if(s<=l && e >= r)
// return segtree[c];
// if(r<e || s>l)
// return 0;
// mid = (l+r)/2;
// return sum(l, mid, s,e,(c*2)+1)+sum(mid+1, r, s,e,(c*2)+2);
// }
// public int buildTree(int[] nums, int startind, int endind, int curr){
// if(startind == endind)
// return segtree[curr] = nums[startind];
// int mid = (startind+endind)/2;
// return segtree[curr] = buildTree(nums, startind, mid, 2*curr+1)+buildTree(nums, mid+1, endind, 2*curr+2);
// }
// }
// /**
// * Your NumArray object will be instantiated and called as such:
// * NumArray obj = new NumArray(nums);
// * obj.update(index,val);
// * int param_2 = obj.sumRange(left,right);
// */
class NumArray {
class TreeNode {
int start, end;
int sum;
TreeNode left, right;
public TreeNode(int start, int end) {
this.start = start;
this.end = end;
this.left = null;
this.right = null;
this.sum = 0;
}
}
TreeNode root = null;
public NumArray(int[] nums) {
root = buildTree(nums, 0, nums.length - 1);
}
private TreeNode buildTree(int[] nums, int start, int end) {
if (start > end) {
return null;
} else {
TreeNode node = new TreeNode(start, end);
if (start == end) {
node.sum = nums[start];
} else {
int mid = start + (end - start) / 2;
node.left = buildTree(nums, start, mid);
node.right = buildTree(nums, mid + 1, end);
node.sum = node.left.sum + node.right.sum;
}
return node;
}
}
public void update(int index, int val) {
update(root, index, val);
}
private void update(TreeNode root, int index, int val) {
if (root.start == root.end) {
root.sum = val;
} else {
int mid = root.start + (root.end - root.start) / 2;
if (index <= mid) {
update(root.left, index, val);
} else {
update(root.right, index, val);
}
root.sum = root.left.sum + root.right.sum;
}
}
public int sumRange(int left, int right) {
return sumRange(root, left, right);
}
private int sumRange(TreeNode root, int start, int end) {
if (root.start == start && root.end == end) {
return root.sum;
}
int mid = root.start + (root.end - root.start) / 2;
if (end <= mid) {
return sumRange(root.left, start, end);
} else if (start >= mid + 1) {
return sumRange(root.right, start, end);
} else {
return sumRange(root.right, mid + 1, end) + sumRange(root.left, start, mid);
}
}
}