6
6
import java .util .BitSet ;
7
7
8
8
public class Solution {
9
- static class SegmentTree {
9
+ private static class SegmentTree {
10
10
static class Node {
11
11
BitSet bits ;
12
12
int minDiff ;
@@ -15,7 +15,7 @@ static class Node {
15
15
int len ;
16
16
int [] nums ;
17
17
Node [] tree ;
18
- static final int inf = 200 ;
18
+ static final int INF = 200 ;
19
19
20
20
SegmentTree (int [] nums , int len ) {
21
21
this .nums = Arrays .copyOf (nums , len );
@@ -25,21 +25,19 @@ static class Node {
25
25
}
26
26
27
27
private void buildTree (int i , int j , int ti ) {
28
- if (i > j ) {
29
- return ;
30
- } else if (i == j ) {
31
- Node node = new Node ();
32
- node .bits = new BitSet (101 );
33
- node .bits .set (nums [i ]);
34
- node .minDiff = inf ;
35
-
36
- tree [ti ] = node ;
37
- } else {
38
- int mid = i + (j - i ) / 2 ;
39
- buildTree (i , mid , 2 * ti + 1 );
40
- buildTree (mid + 1 , j , 2 * ti + 2 );
41
-
42
- tree [ti ] = combineNodes (tree [2 * ti + 1 ], tree [2 * ti + 2 ]);
28
+ if (i <= j ) {
29
+ if (i == j ) {
30
+ Node node = new Node ();
31
+ node .bits = new BitSet (101 );
32
+ node .bits .set (nums [i ]);
33
+ node .minDiff = INF ;
34
+ tree [ti ] = node ;
35
+ } else {
36
+ int mid = i + (j - i ) / 2 ;
37
+ buildTree (i , mid , 2 * ti + 1 );
38
+ buildTree (mid + 1 , j , 2 * ti + 2 );
39
+ tree [ti ] = combineNodes (tree [2 * ti + 1 ], tree [2 * ti + 2 ]);
40
+ }
43
41
}
44
42
}
45
43
@@ -57,8 +55,9 @@ private Node combineNodes(Node n1, Node n2) {
57
55
}
58
56
59
57
private int findMinDiff (BitSet bits ) {
60
- int first = bits .nextSetBit (1 ); // minimum value of number is 1.
61
- int minDiff = inf ;
58
+ // minimum value of number is 1.
59
+ int first = bits .nextSetBit (1 );
60
+ int minDiff = INF ;
62
61
while (first != -1 ) {
63
62
int next = bits .nextSetBit (first + 1 );
64
63
if (next != -1 ) {
@@ -69,42 +68,39 @@ private int findMinDiff(BitSet bits) {
69
68
}
70
69
first = next ;
71
70
}
72
-
73
71
return minDiff ;
74
72
}
75
73
76
74
private int findMinAbsDiff (int start , int end , int i , int j , int ti ) {
77
- Node node = _findMinAbsDiff (start , end , i , j , ti );
78
- return node .minDiff == inf ? -1 : node .minDiff ;
75
+ Node node = findMinAbsDiff2 (start , end , i , j , ti );
76
+ return node .minDiff == INF ? -1 : node .minDiff ;
79
77
}
80
78
81
- private Node _findMinAbsDiff (int start , int end , int i , int j , int ti ) {
79
+ private Node findMinAbsDiff2 (int start , int end , int i , int j , int ti ) {
82
80
if (i == start && j == end ) {
83
81
return tree [ti ];
84
82
}
85
-
86
83
int mid = i + (j - i ) / 2 ;
87
84
if (end <= mid ) {
88
- return _findMinAbsDiff (start , end , i , mid , 2 * ti + 1 );
85
+ return findMinAbsDiff2 (start , end , i , mid , 2 * ti + 1 );
89
86
} else if (start >= mid + 1 ) {
90
- return _findMinAbsDiff (start , end , mid + 1 , j , 2 * ti + 2 );
87
+ return findMinAbsDiff2 (start , end , mid + 1 , j , 2 * ti + 2 );
91
88
} else {
92
- Node left = _findMinAbsDiff (start , mid , i , mid , 2 * ti + 1 );
93
- Node right = _findMinAbsDiff (mid + 1 , end , mid + 1 , j , 2 * ti + 2 );
89
+ Node left = findMinAbsDiff2 (start , mid , i , mid , 2 * ti + 1 );
90
+ Node right = findMinAbsDiff2 (mid + 1 , end , mid + 1 , j , 2 * ti + 2 );
94
91
return combineNodes (left , right );
95
92
}
96
93
}
97
94
}
98
95
99
96
public int [] minDifference (int [] nums , int [][] queries ) {
100
- int len = nums .length , qlen = queries .length ;
97
+ int len = nums .length ;
98
+ int qlen = queries .length ;
101
99
SegmentTree st = new SegmentTree (nums , len );
102
100
int [] answer = new int [qlen ];
103
-
104
101
for (int i = 0 ; i < qlen ; ++i ) {
105
102
answer [i ] = st .findMinAbsDiff (queries [i ][0 ], queries [i ][1 ], 0 , len - 1 , 0 );
106
103
}
107
-
108
104
return answer ;
109
105
}
110
106
}
0 commit comments