Welcome to Subscribe On Youtube
Formatted question description: https://leetcode.ca/all/435.html
435. Non-overlapping Intervals (Medium)
Given a collection of intervals, find the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping.
Example 1:
Input: [[1,2],[2,3],[3,4],[1,3]] Output: 1 Explanation: [1,3] can be removed and the rest of intervals are non-overlapping.
Example 2:
Input: [[1,2],[1,2],[1,2]] Output: 2 Explanation: You need to remove two [1,2] to make the rest of intervals non-overlapping.
Example 3:
Input: [[1,2],[2,3]] Output: 0 Explanation: You don't need to remove any of the intervals since they're already non-overlapping.
Note:
- You may assume the interval's end point is always bigger than its start point.
- Intervals like [1,2] and [2,3] have borders "touching" but they don't overlap each other.
Related Topics:
Greedy
Similar Questions:
Solution 1. Interval Scheduling Maximization Problem
// OJ: https://leetcode.com/problems/non-overlapping-intervals/
// Time: O(NlogN)
// Space: O(1)
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& A) {
sort(begin(A), end(A), [](auto &a, auto &b) { return a[1] < b[1]; });
int ans = 0, e = INT_MIN;
for (auto &v : A) {
if (v[0] >= e) e = v[1];
else ++ans;
}
return ans;
}
};
-
class Solution { public int eraseOverlapIntervals(int[][] intervals) { if (intervals == null || intervals.length == 0) return 0; Arrays.sort(intervals, new Comparator<int[]>() { public int compare(int[] interval1, int[] interval2) { if (interval1[0] != interval2[0]) return interval1[0] - interval2[0]; else return interval1[1] - interval2[1]; } }); int eraseCount = 0; int prev = 0; int length = intervals.length; for (int i = 1; i < length; i++) { if (intervals[prev][1] > intervals[i][0]) { if (intervals[prev][1] > intervals[i][1]) prev = i; eraseCount++; } else prev = i; } return eraseCount; } } ############ class Solution { public int eraseOverlapIntervals(int[][] intervals) { Arrays.sort(intervals, Comparator.comparingInt(a -> a[1])); int t = intervals[0][1], ans = 0; for (int i = 1; i < intervals.length; ++i) { if (intervals[i][0] >= t) { t = intervals[i][1]; } else { ++ans; } } return ans; } }
-
// OJ: https://leetcode.com/problems/non-overlapping-intervals/ // Time: O(NlogN) // Space: O(1) class Solution { public: int eraseOverlapIntervals(vector<vector<int>>& A) { sort(begin(A), end(A), [](auto &a, auto &b) { return a[1] < b[1]; }); int ans = 0, e = INT_MIN; for (auto &v : A) { if (v[0] >= e) e = v[1]; else ++ans; } return ans; } };
-
class Solution: def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int: intervals.sort(key=lambda x: x[1]) ans, t = 0, intervals[0][1] for s, e in intervals[1:]: if s >= t: t = e else: ans += 1 return ans ############ # Definition for an interval. # class Interval(object): # def __init__(self, s=0, e=0): # self.start = s # self.end = e class Solution(object): def eraseOverlapIntervals(self, intervals): """ :type intervals: List[Interval] :rtype: int """ intervals.sort(key=lambda i: i.end) ans = 0 end = float("-inf") for interval in intervals: # print interval.start, interval.end if interval.start >= end: ans += 1 end = interval.end return len(intervals) - ans
-
func eraseOverlapIntervals(intervals [][]int) int { sort.Slice(intervals, func(i, j int) bool { return intervals[i][1] < intervals[j][1] }) t, ans := intervals[0][1], 0 for i := 1; i < len(intervals); i++ { if intervals[i][0] >= t { t = intervals[i][1] } else { ans++ } } return ans }
-
function eraseOverlapIntervals(intervals: number[][]): number { intervals.sort((a, b) => a[1] - b[1]); let end = intervals[0][1], ans = 0; for (let i = 1; i < intervals.length; ++i) { let cur = intervals[i]; if (end > cur[0]) { ans++; } else { end = cur[1]; } } return ans; }