-
-
Notifications
You must be signed in to change notification settings - Fork 8.9k
/
Copy pathSolution.java
40 lines (40 loc) · 1.3 KB
/
Solution.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
class Solution {
public int[] closestRoom(int[][] rooms, int[][] queries) {
int n = rooms.length;
int k = queries.length;
Arrays.sort(rooms, (a, b) -> a[1] - b[1]);
Integer[] idx = new Integer[k];
for (int i = 0; i < k; i++) {
idx[i] = i;
}
Arrays.sort(idx, (i, j) -> queries[i][1] - queries[j][1]);
int i = 0;
TreeMap<Integer, Integer> tm = new TreeMap<>();
for (int[] room : rooms) {
tm.merge(room[0], 1, Integer::sum);
}
int[] ans = new int[k];
Arrays.fill(ans, -1);
for (int j : idx) {
int prefer = queries[j][0], minSize = queries[j][1];
while (i < n && rooms[i][1] < minSize) {
if (tm.merge(rooms[i][0], -1, Integer::sum) == 0) {
tm.remove(rooms[i][0]);
}
++i;
}
if (i == n) {
break;
}
Integer p = tm.ceilingKey(prefer);
if (p != null) {
ans[j] = p;
}
p = tm.floorKey(prefer);
if (p != null && (ans[j] == -1 || ans[j] - prefer >= prefer - p)) {
ans[j] = p;
}
}
return ans;
}
}