Given a set of intervals, for each of the interval i, check if there exists an interval j whose start point is bigger than or equal to the end point of the interval i, which can be called that j is on the "right" of i.
For any interval i, you need to store the minimum interval j's index, which means that the interval j has the minimum start point to build the "right" relationship for interval i. If the interval j doesn't exist, store -1 for the interval i. Finally, you need output the stored value of each interval as an array.
Note:
- You may assume the interval's end point is always bigger than its start point.
- You may assume none of these intervals have the same start point.
Example 1:
Input: [ [1,2] ]
Output: [-1]
Explanation: There is only one interval in the collection, so it outputs -1.
思路:题目要求很明显就是找第一个比自己大的start >= 我当前的end。所以找第一个比自己大,这个东西很好用treemap, 每次查找是logn, ceilingKey来找第一个比自己大的interval start,treemap里面存start和index;
class Solution {
public int[] findRightInterval(int[][] intervals) {
if(intervals == null || intervals.length == 0) {
return new int[0];
}
int n = intervals.length;
TreeMap<Integer, Integer> treemap = new TreeMap<>();
for(int i = 0; i < n; i++) {
treemap.put(intervals[i][0], i);
}
int[] res = new int[n];
for(int i = 0; i < n; i++) {
Integer ceilingKey = treemap.ceilingKey(intervals[i][1]);
if(ceilingKey == null) {
res[i] = -1;
} else {
res[i] = treemap.get(ceilingKey);
}
}
return res;
}
}