难度:Medium
题目:
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当
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]
Related Topics
- 数组
- 排序
重点!!!解题思路
明确解题思路:
此题类似LeetCode[56]合并区间这道题,前一道题是要将相交的区间合并,但是这一道题要求将包含的区间删除,这一道题明显比前一道题简单,因为此题并不需要考虑交集的情况,之需要考虑什么条件包含即可。
源码+讲解:
class Solution {
public 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 cnt=0,end=0,pre_end=0; //end是此时的右区间,pre_end是上一个右区间
for (int[] interval : intervals) {
end=interval[1]; //拿到每次的右区间
if (end>pre_end){ //当此时的右区间比上一个右区间大时,才能确定这两个区间并不是包含关系
cnt++; //既然不是包含关系 说明不用删除 数组长度可以加1
pre_end=end;
}
}
return cnt;
}
}
运行结果:
如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。
系列持续更新中,点个订阅吧,喜欢练习算法那就点个攒吧