【leetcode】436. Find Right Interval
题目如下:
解题思路:题目要求的是对于任意一个区间i,要找出一个区间j,使得j的起点最接近i的终点。既然这样,我们可以把所有区间的终点组成一个列表,并按大小排序,使用二分查找就可以快速找到j区间。注意要保存新的列表和输入的区间列表的元素映射关系,这样才能快速找到j区间在输入区间列表的索引。
代码如下:
class Solution(object): def findRightInterval(self, intervals): """ :type intervals: List[Interval] :rtype: List[int] """ #print intervals[8].start,intervals[8].end #print intervals[15].start,intervals[15].end sl = intervals[:] def cmpf(i1,i2): if i1.start != i2.start: return i1.start - i2.start return i1.end - i2.end sl.sort(cmp = cmpf) dic_inx = {} for i,v in enumerate(intervals): dic_inx[(v.start,v.end)] = i binL = [] for i, v in enumerate(sl): binL.append(v.start) res = [] for i in intervals: import bisect inx = bisect.bisect_left(binL,i.end) if inx <= 0 or inx > len(binL) - 1: res.append(-1) else: #res.append(inx) res.append(dic_inx[(sl[inx].start, sl[inx].end)]) return res