目标
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。
在完成所有删除操作后,请你返回列表中剩余区间的数目。
示例:
输入:intervals = [[1,4],[3,6],[2,8]]
输出:2
解释:区间 [3,6] 被区间 [2,8] 覆盖,所以它被删除了。
说明:
- 1 <= intervals.length <= 1000
- 0 <= intervals[i][0] < intervals[i][1] <= 10^5
- 对于所有的 i != j:intervals[i] != intervals[j]
思路
有一个区间列表,删除被其它区间覆盖的区间,返回剩余的区间。区间 [a, b] 被区间[c, d] 覆盖需满足 c <= a && b <= d。
根据左端点从小到大排序,右端点从大到小排序。按顺序遍历排序后的数组,当前区间的左端点一定大于等于之前的区间的左端点,只需要判断右端点是否超过前面记录的最长右端点即可。
代码
/**
* @date 2026-07-06 9:00
*/
public class RemoveCoveredIntervals1288 {
public int removeCoveredIntervals(int[][] intervals) {
int n = intervals.length;
Arrays.sort(intervals, (a, b) -> {
int compare = a[0] - b[0];
return compare != 0 ? compare : b[1] - a[1];
});
int r = intervals[0][1];
int res = 0;
for (int i = 1; i < n; i++) {
if (intervals[i][1] <= r) {
res++;
} else {
r = intervals[i][1];
}
}
return n - res;
}
}
性能
