题意:
给出一个数组,代表一列区间,每个区间如果有区间在它的右边(即有区间的起点大于等于它的终点,则记录右边离它最近的区间在数组的角标,如果右边没有区间记为-1),
分析:
对于某一个结尾就是要查找它第一次在哪一个开头之前,所以我们可以对开头排序。至于最后的输出需要匹配序号,序号和开头的对应关系可以通过map。至于排序,实现一个查找右边大的数的二分查找,提高效率。
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
public int[] findRightInterval(Interval[] intervals) {
Map<Integer, Integer> map = new HashMap<>();
int[] starts = new int[intervals.length];
for (int i = 0; i < intervals.length; i++) {
map.put(intervals[i].start, i);
starts[i] = intervals[i].start;
}
Arrays.sort(starts);
int[] res = new int[intervals.length];
for (int i = 0; i < intervals.length; i++) {
int end = intervals[i].end;
int start = binarySearch(starts, end);
if (start < end) {
res[i] = -1;
} else {
res[i] = map.get(start);
}
}
return res;
}
public int binarySearch(int[] arr, int x) {
int low = 0;
int high = list.length - 1;
while (low < high) {
int mid = low + (high - low) / 2;
if (arr[mid] < x) {
low = mid + 1;
} else {
high = mid;
}
}
return arr[low];
}
}