LeetCode 436. Find Right Interval

来源:互联网 发布:达内java五虎将 编辑:程序博客网 时间:2024/05/16 06:03

题目链接 436. Find Right Interval

题意

给定一组区间,对于每一个区间i,检查是否存在一个区间j的start点大于或等于i的end点的区间i,称为j是i的“右边”。
对于任何区间i,你需要存储的最小区间j的下标,这意味着区间j对于区间i来说拥有最小的start点来建立“右边”关系,如区间j不存在,为区间i存-1。最后存储每一个区间的结果到数组。
Note:
   1.可以假设间隔的终点总是大于起始点。
   2.可以假设这些间隔没有一个相同的起点。

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

Example 2:
Input: [ [3,4], [2,3], [1,2] ]
Output: [-1, 0, 1]
Explanation: There is no satisfied “right” interval for [3,4].
For [2,3], the interval [3,4] has minimum-“right” start point;
For [1,2], the interval [2,3] has minimum-“right” start point.

Example 3:
Input: [ [1,4], [2,3], [3,4] ]
Output: [-1, 2, -1]
Explanation: There is no satisfied “right” interval for [1,4] and [3,4].
For [2,3], the interval [3,4] has minimum-“right” start point.

思路

对于每一个区间的end,找到满足start>=end的最小start区间下标。
转化为在序列中查找是否>=target的数的下标。使用二分法。

代码

class Solution(object):    def findRightInterval(self, intervals):        blst = sorted([(e.start, i) for i, e in enumerate(intervals)])        ans = []        for e in intervals:            ans.append(self.bsearch(blst, e.end))        return ans    def bsearch(self, lst, val):        l, r = 0, len(lst) - 1        while (l < r):            m = (l + r)/2;            if lst[m][0] < val:                l = m + 1            else:                r = m        return -1 if lst[l][0] < val else lst[l][1]
0 0
原创粉丝点击