好久没写二分了,这种upper和lower的二分用target这种方式写很方便,如果满足条件,就记录target,需要注意的是这里的end是开区间。
import java.util.Arrays;
import java.util.Comparator;
class Solution {
static class Node {
int index;
int[] values;
public Node(int index, int[] values) {
this.index = index;
this.values = values;
}
}
public int[] findRightInterval(int[][] intervals) {
int len = intervals.length;
Node[] nodes = new Node[len];
for (int i = 0; i < len; i++) {
nodes[i] = new Node(i, intervals[i]);
}
Arrays.sort(nodes, Comparator.comparingInt(o -> o.values[0]));
int[] ans = new int[len];
ans[nodes[len - 1].index] = -1;
for (int i = 0; i < len - 1; i++) {
int val = nodes[i].values[1];
ans[nodes[i].index] = binarySearch(nodes, i, len, val);
}
return ans;
}
/**
* 从下标start到end的nodes中找一个值>=val的node.index
*
* @param nodes
* @param start
* @param end
* @param val
* @return 返回下标
*/
int binarySearch(Node[] nodes, int start, int end, int val) {
int target = -1;
while(start < end) {
int mid = (start + end) >> 1;
if (nodes[mid].values[0] >= val) {
end = mid;
target = nodes[mid].index;
} else {
start = mid + 1;
}
}
return target;
}
}