LeetCode 436. Find Right Interval

题目

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 1:

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

Example 2:

1
2
3
4
5
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:

1
2
3
4
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
  • -106 <= start_i <= end_i <= 106
  • The start point of each interval is unique.

思路

Sort + Binary Search.
First, sorted every interval by interval[0], record a tuple(interval[0], i, interval[1]).
Second, bisect.bisect_left every interval by interval[2], return index, record r = index.
Last, res[i] = interval[r][1] = index.

代码

1
2
3
4
5
6
7
8
9
class Solution:
def findRightInterval(self, intervals: List[List[int]]) -> List[int]:
interval = sorted((e[0], i, e[1]) for i, e in enumerate(intervals))
l = len(interval)
res = [0] * l
for e in interval:
r = bisect.bisect_left(interval, (e[2], ))
res[e[1]] = interval[r][1] if r < l else -1
return res