LeetCode #436 Find Right Interval 尋找右區(qū)間

436 Find Right Interval 尋找右區(qū)間

Description:
You are given an array of intervals, where intervals[i] = [start_i, end_i] and each start_i is unique.

The right interval for an interval i is an interval j such that start_j >= end_i and start_j is minimized.

Return an array of right interval indices for each interval i. If no right interval exists for interval i, then put -1 at index i.

Example:

Example 1:

Input: intervals = [[1,2]]
Output: [-1]
Explanation: There is only one interval in the collection, so it outputs -1.

Example 2:

Input: intervals = [[3,4],[2,3],[1,2]]
Output: [-1,0,1]
Explanation: There is no right interval for [3,4].
The right interval for [2,3] is [3,4] since start0 = 3 is the smallest start that is >= end1 = 3.
The right interval for [1,2] is [2,3] since start1 = 2 is the smallest start that is >= end2 = 2.

Example 3:

Input: intervals = [[1,4],[2,3],[3,4]]
Output: [-1,2,-1]
Explanation: There is no right interval for [1,4] and [3,4].
The right interval for [2,3] is [3,4] since start2 = 3 is the smallest start that is >= end1 = 3.

Constraints:

1 <= intervals.length <= 2 * 10^4
intervals[i].length == 2
-10^6 <= starti <= endi <= 10^6
The start point of each interval is unique.

題目描述:
給定一組區(qū)間,對于每一個區(qū)間 i耘沼,檢查是否存在一個區(qū)間 j真慢,它的起始點大于或等于區(qū)間 i 的終點澈段,這可以稱為 j 在 i 的“右側(cè)”。

對于任何區(qū)間英支,你需要存儲的滿足條件的區(qū)間 j 的最小索引,這意味著區(qū)間 j 有最小的起始點可以使其成為“右側(cè)”區(qū)間。如果區(qū)間 j 不存在蔽介,則將區(qū)間 i 存儲為 -1。最后,你需要輸出一個值為存儲的區(qū)間值的數(shù)組虹蓄。

注意:

你可以假設區(qū)間的終點總是大于它的起始點犀呼。
你可以假定這些區(qū)間都不具有相同的起始點。

示例 :

示例 1:

輸入: [ [1,2] ]
輸出: [-1]

解釋:集合中只有一個區(qū)間武花,所以輸出-1圆凰。

示例 2:

輸入: [ [3,4], [2,3], [1,2] ]
輸出: [-1, 0, 1]

解釋:對于[3,4],沒有滿足條件的“右側(cè)”區(qū)間体箕。
對于[2,3]专钉,區(qū)間[3,4]具有最小的“右”起點;
對于[1,2],區(qū)間[2,3]具有最小的“右”起點累铅。

示例 3:

輸入: [ [1,4], [2,3], [3,4] ]
輸出: [-1, 2, -1]

解釋:對于區(qū)間[1,4]和[3,4]跃须,沒有滿足條件的“右側(cè)”區(qū)間。
對于[2,3]娃兽,區(qū)間[3,4]有最小的“右”起點菇民。

思路:

對區(qū)間的左端點進行排序, 排序之后可以用二分查找查詢
時間復雜度O(nlgn), 空間復雜度O(n)

代碼:
C++:

class Solution 
{
public:
    vector<int> findRightInterval(vector<vector<int>>& intervals) 
    {
        map<int, int> m;
        vector<int> result;
        for (int i = 0; i < intervals.size(); i++) m[intervals[i].front()] = i;
        for (auto interval : intervals) result.emplace_back(m.lower_bound(interval.back()) == m.end() ? -1 : m.lower_bound(interval.back()) -> second);
        return result;
    }
};

Java:

class Solution {
    public int[] findRightInterval(int[][] intervals) {
        int count[][] = new int[intervals.length][2], n = intervals.length, result[] = new int[intervals.length], m = 0;
        for (int i = 0; i < n; i++) {
            count[i][0] = intervals[i][0];
            count[i][1] = i;
        }
        Arrays.sort(count, new Comparator<int[]>(){ public int compare (int[] a, int[] b) { return a[0] - b[0]; } });
        for (int interval[] : intervals) {
            int target = interval[1], l = 0, r = n;
            while (l < r) {
                int mid = (l + r) >> 1;
                if (count[mid][0] < target) l = mid + 1;
                else r = mid;
            }
            result[m++] = (l == n ? -1 : count[l][1]);
        }
        return result;
    }
}

Python:

class Solution:
    def findRightInterval(self, intervals: List[List[int]]) -> List[int]:
        sorted_intervals, result = sorted([(interval[0], i) for i, interval in enumerate(intervals)]), []
        for interval in intervals:
            target, l, r = interval[1], 0, len(intervals) 
            while l < r:
                mid = (l + r) >> 1
                if sorted_intervals[mid][0] < target:
                    l = mid + 1
                else:
                    r = mid
            result.append(-1 if l == len(intervals) else sorted_intervals[l][1])
        return result
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市投储,隨后出現(xiàn)的幾起案子第练,更是在濱河造成了極大的恐慌,老刑警劉巖玛荞,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娇掏,死亡現(xiàn)場離奇詭異,居然都是意外死亡勋眯,警方通過查閱死者的電腦和手機婴梧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來客蹋,“玉大人塞蹭,你說我怎么就攤上這事⊙扰鳎” “怎么了番电?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辆琅。 經(jīng)常有香客問我钧舌,道長,這世上最難降的妖魔是什么涎跨? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任洼冻,我火速辦了婚禮,結(jié)果婚禮上隅很,老公的妹妹穿的比我還像新娘撞牢。我一直安慰自己率碾,他們只是感情好,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布屋彪。 她就那樣靜靜地躺著所宰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畜挥。 梳的紋絲不亂的頭發(fā)上仔粥,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音蟹但,去河邊找鬼躯泰。 笑死,一個胖子當著我的面吹牛华糖,可吹牛的內(nèi)容都是我干的麦向。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼客叉,長吁一口氣:“原來是場噩夢啊……” “哼诵竭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起兼搏,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤卵慰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后佛呻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呵燕,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年件相,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氧苍。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡夜矗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出让虐,到底是詐尸還是另有隱情紊撕,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布赡突,位于F島的核電站对扶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惭缰。R本人自食惡果不足惜浪南,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漱受。 院中可真熱鬧络凿,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至怨愤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間篮愉,已是汗流浹背潜支。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留柿汛,地道東北人冗酿。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像络断,于是被迫代替她去往敵國和親裁替。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容