436. 寻找右区间
【二分】我们将左端点和下标组成一个元祖,按照左端点从小到大排序,然后对每个区间寻找>=右端点的最小值即可。
二分查找的时候注意当nums[mid]>=target的时候我们就往左边找,这样结束后左边都是<target的值,同时right为左边的右边界,left为右边的左边界,所以直接返回left就行了。
插一句题外话,二分查找的精髓其实是维护一个左区间,也就是让不让左区间包含==的情况,而这主要通过right = mid - 1的条件判定来决定,如果==的时候让right = mid - 1,那么左边就不包括==的情况了。
class Solution {public int binarySearch(List<int[]> list, int target){int left = 0, right = list.size() - 1;while(left <= right){int mid = (left + right) >>> 1;if(list.get(mid)[0] >= target) right = mid - 1;else left = mid + 1;}return left;}public int[] findRightInterval(int[][] intervals) {List<int[]> list = new ArrayList();int i = 0, n = intervals.length;for(var it: intervals){list.add(new int[] {it[0], i++});}Collections.sort(list, (x, y)->{return x[0] - y[0];});int[] ans = new int[n];for(i = 0; i < n; i++){int[] tmp = intervals[i];int idx = binarySearch(list, tmp[1]);if(idx < 0 || idx >= n) ans[i] = -1;else ans[i] = list.get(idx)[1];}return ans;}
}