|
1 |
| -/** |
2 |
| - * Definition for an interval. |
3 |
| - * public class Interval { |
4 |
| - * int start; |
5 |
| - * int end; |
6 |
| - * Interval() { start = 0; end = 0; } |
7 |
| - * Interval(int s, int e) { start = s; end = e; } |
8 |
| - * } |
9 |
| - */ |
10 | 1 | class Solution {
|
11 |
| - public int[] findRightInterval(Interval[] intervals) { |
12 |
| - int n = intervals.length; |
13 |
| - if (n == 1) { |
14 |
| - return new int[]{-1}; |
15 |
| - } |
16 |
| - |
17 |
| - int[] start = new int[n]; |
18 |
| - Map<Integer, Integer> map = new HashMap<>(); |
19 |
| - for (int i=0; i<intervals.length; i++) { |
20 |
| - start[i] = intervals[i].start; |
21 |
| - map.put(intervals[i].start, i); |
22 |
| - } |
23 |
| - |
24 |
| - Arrays.sort(start); |
25 |
| - int[] ans = new int[intervals.length]; |
26 |
| - for (int i=0; i<n; i++) { |
27 |
| - int end = intervals[i].end; |
28 |
| - int x = Arrays.binarySearch(start, end); |
29 |
| - if (x > 0) { |
30 |
| - ans[i] = map.get(end); |
31 |
| - } |
32 |
| - else if (-x > n) { |
33 |
| - ans[i] = -1; |
34 |
| - } |
35 |
| - else { |
36 |
| - ans[i] = map.get(start[-x-1]); |
37 |
| - } |
38 |
| - } |
39 |
| - |
40 |
| - return ans; |
| 2 | + public int[] findRightInterval(int[][] intervals) { |
| 3 | + TreeMap<Integer, PriorityQueue<Integer>> map = new TreeMap<>(); |
| 4 | + for (int i = 0; i < intervals.length; i++) { |
| 5 | + map.computeIfAbsent(intervals[i][0], k -> new PriorityQueue<>( |
| 6 | + Comparator.comparingInt(o -> intervals[o][0])) |
| 7 | + ).add(i); |
41 | 8 | }
|
| 9 | + int[] ans = new int[intervals.length]; |
| 10 | + Arrays.fill(ans, -1); |
| 11 | + for (int i = 0; i < intervals.length; i++) { |
| 12 | + Integer upper = map.ceilingKey(intervals[i][1]); |
| 13 | + if (upper != null) { |
| 14 | + ans[i] = map.get(upper).peek(); |
| 15 | + } |
| 16 | + } |
| 17 | + return ans; |
| 18 | + } |
42 | 19 | }
|
0 commit comments