**
题目描述:
**
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 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]
**
解题思路:
**
- 获得区间端点
- 将各个区间按照左端点进行升序排列,如果左端点相同的话按照右端点降序排列
原来的区间图:
排序之后的区间图:
3.根据排序之后的区间,保证后一个区间如果右端点较大,那么它一定不被在他之前的区间包含,以此比较右端点,若下一个区间的右端点比较小,则其被包含,若不小,则不被包含,且当前右端点记录值更换
扫描二维码关注公众号,回复:
10753475 查看本文章
**
解题代码:
**
public static int removeCoveredIntervals(int[][] intervals) {
// 定义排序方式:按照左区间升序排列,如果左区间相同,按照右区间降序
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0]==o2[0] ? o2[1]-o1[1] : o1[0]-o2[0];
}
});
// 记录区间数
int count = 0;
// 记录右区间最大点
int max_right = 0;
for(int[] interval : intervals){
if(max_right<interval[1]){
count++;
max_right = interval[1];
}
}
return count;
}
**
个人收获:
**
看到这个题之后总觉得不会很难,确实,如果不将其进行排序,遍历数组,判断当前区间是否被包含,就能确定最后剩余的区间数,但是将其进行了排序之后时间复杂度为:O(NlogN)O(NlogN),
空间复杂度为:O(1)。既节省时间又节省空间的解决问题,这才是努力学习算法的目的