一、Problem
Given a list of intervals, remove all intervals that are covered by another interval in the list. Interval [a,b) is covered by interval [c,d) if and only if c <= a and b <= d.
After doing so, return the number of remaining intervals.
Input: intervals = [[1,4],[3,6],[2,8]]
Output: 2
Explanation: Interval [3,6] is covered by [2,8], therefore it is removed.
Constraints:
1 <= intervals.length <= 1000
0 <= intervals[i][0] < intervals[i][1] <= 10^5
intervals[i] != intervals[j] for all i != j
二、Solution
方法一:贪心
Q:如何排序才能让需要检查条件减少?
A:按区间的起点升序,按区间终点降序后,因为起点是升序的了,所以只需要检查区间的结尾的大小关系。
class Solution {
public int removeCoveredIntervals(int[][] a) {
int n = a.length;
Arrays.sort(a, (e1, e2) -> {
if (e1[0] == e2[0])
return e2[1] - e1[1];
return e1[0] - e2[0];
});
int delete = 0, maxEnd = a[0][1];
for (int i = 1; i < n; i++) {
if (a[i][1] <= maxEnd) delete++;
else maxEnd = a[i][1];
}
return n - delete;
}
}
复杂度分析
- 时间复杂度:,
- 空间复杂度:,