Advertisement
goodwish

1241. Find Right Interval

Oct 2nd, 2019
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.71 KB | None | 0 0
  1. 性能排名, 倒数第一. 哈哈.
  2.  
  3. idea:
  4. 用一个数组 xs 维护所有区间的起始点(interval.start),  排序.
  5. 对于一个区间, 然后在 xs 里面二分查找第一个大于等于 该区间右边界(interval.end).
  6.  
  7. 数据结构:
  8. xs: array, el = (itv, id), id 记录原始的索引.
  9. 或者,
  10. xs: array, el = (start, end, id), 在 xs 里面找大于等于 interval.end 的第一个 id,
  11.  
  12.  
  13. class Solution:
  14.     """
  15.    @param intervals: a list of intervals
  16.    @return: return a list of integers
  17.    1,5; 2,3; 3,4; 5;6
  18.    """
  19.     def findRightInterval(self, intervals):
  20.         # write your code here
  21.         def lt(this, other):
  22.             if this.start < other.start:
  23.                 return True
  24.             if this.start == other.start and this.end <= other.end:
  25.                 return True
  26.             return False
  27.        
  28.         Interval.__lt__ = lt
  29.         xs = []
  30.         for i, itv in enumerate(intervals):
  31.             xs.append((itv, i))
  32.         xs.sort()
  33.         n = len(xs)
  34.         res = []
  35.         for i in range(n):
  36.             itv_end = xs[i][0].end
  37.             right_i = self.bi_left(xs, i, itv_end)
  38.             if right_i == -1:
  39.                 res.append((xs[i][1], -1))
  40.                 continue
  41.             res.append((xs[i][1], xs[right_i][1]))
  42.         res.sort()
  43.         return [v[1] for v in res]
  44.    
  45.     def bi_left(self, xs, i, itv_end):
  46.         n = len(xs)
  47.         start, end = i, n
  48.         while start < end:
  49.             mid = (start + end)//2
  50.             if xs[mid][0].start < itv_end:
  51.                 start = mid + 1
  52.             else:
  53.                 end = mid
  54.         # print(start, end)
  55.         if start == n:
  56.             return -1
  57.         return start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement