【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

 

posted @ 2018-08-20 19:16  seyjs  阅读(158)  评论(0编辑  收藏  举报