leetcode 436. Find Right Interval | 436. 寻找右区间(二分查找不小于某值的第一个位置)
生活随笔
收集整理的這篇文章主要介紹了
leetcode 436. Find Right Interval | 436. 寻找右区间(二分查找不小于某值的第一个位置)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
https://leetcode.com/problems/find-right-interval/
題解
這題考察點不難,就是個普通的二分查找。詳細過程是:
因為 start 是唯一的,所以先用 map 存儲每一個 start 的對應下標。然后根據 start 的大小,對數組進行排序,方便二分查找。
最后,對于未排序數組中的每一個 end 值,分別在排序好的數組中,找到不小于 end[i] 的第一個元素。需要注意的是,找到的位置不能是 i 本身。
思路很樸素,但是二分查找的細節比較耗時,而且每次都花很長時間在扣邊界上。等有時間看下別人的邊界的寫法。
class Solution {public int[] findRightInterval(int[][] arr) {int L = arr.length;HashMap<Integer, Integer> map = new HashMap<>();map.put(-1, -1);int[] end = new int[L];for (int i = 0; i < L; i++) {end[i] = arr[i][1];map.put(arr[i][0], i);}Arrays.sort(arr, Comparator.comparingInt(o -> o[0])); // start is uniqueint[] result = new int[L];for (int i = 0; i < L; i++) {result[i] = binarySearch(arr, end[i], 0, L - 1, i, map);}return result;}public int binarySearch(int[][] arr, int target, int L, int R, int i, HashMap<Integer, Integer> map) {if (arr[R][0] < target) return -1;// 只看(start,?),找第一個start不小于target的位置while (L < R) {int M = L + ((R - L) >> 1);if (arr[M][0] == target) {return map.get(arr[M][0]);} else if (arr[M][0] < target) {L = M + 1;} else {// 保右端點if (R == M) return map.get(arr[M][0]);R = M;}}if (map.get(arr[L][0]) == i) L += 1; // 目標位置不能是i位置本身if (L >= arr.length) return -1;else return map.get(arr[L][0]);} }總結
以上是生活随笔為你收集整理的leetcode 436. Find Right Interval | 436. 寻找右区间(二分查找不小于某值的第一个位置)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 435. Non-ov
- 下一篇: leetcode 926. Flip S