LC 435 - Non-overlapping Intervals
LC 435 - Non-overlapping Intervals
Question
Given an array of intervals intervals where intervals[i] = [starti, endi], return the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping.
Note that intervals which only touch at a point are non-overlapping. For example, [1, 2] and [2, 3] are non-overlapping.
Example 1:
1
2
Input: intervals = [[1,2],[2,3],[3,4],[1,3]]
Output: 1
Explanation: [1,3] can be removed and the rest of the intervals are non-overlapping.
Example 2:
1
2
Input: intervals = [[1,2],[1,2],[1,2]]
Output: 2
Explanation: You need to remove two [1,2] to make the rest of the intervals non-overlapping.
Example 3:
1
2
Input: intervals = [[1,2],[2,3]]
Output: 0
Explanation: You don’t need to remove any of the intervals since they’re already non-overlapping.
Constraints:
1 <= intervals.length <= 105intervals[i].length == 2-5 * 104 <= starti < endi <= 5 * 104
Links
Question here and solution here
Solution
concept
- We first sort the intervals (either by start or end, start will be a bit more intuitive)
- we keep track the current ending point in
prev_end - As we iterate through the intervals, we need to check:
- if the current interval is overlapping with the previous intervals
- by checking if
start >= prev_end, if true means it is not overlapping. Since it is sorted, we are sure the current start is >= prev_start so this condition is enough. - If true, we will update
prev_endto the current interval, since they are not overlapping.
- by checking if
- if the current interval is overlapping:
- we need to remove the interval with larger end point to maximize the likelihood that the future intervals won’t be overlapping current intervals.
- if the current interval is overlapping with the previous intervals
code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
intervals.sort()
prev_end = intervals[0][1]
ans = 0
for start, end in intervals[1:]:
if start >= prev_end:
prev_end = end
else:
ans += 1
prev_end = min(prev_end, end)
return ans
Complexity
time: $O(n \log n)$
space: $O(n)$
This post is licensed under CC BY 4.0 by the author.