「这是我参与2022首次更文挑战的第36天,活动详情查看:2022首次更文挑战」
题目
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 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]
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。
解题思路
当对区间数组进行排序后,后一个区间的左区间大于等于前一个区间的左区间,这时如果后一个区间的右区间小于等于前一个区间的右区间,则该区间被前一个区间覆盖。
如下图 [[1,4],[3,6],[2,8]],首先对区间进行排序:左区间相等时按右区间排倒序,不相等时按区间排升序。排序后,区间[3,6]左区间大于2,右区间小于8,所以被区间[2,8]覆盖。
如下图 [[1,4],[1,6],[1,8]],对区间排序后,左区间相同,按右区间排倒序,[1,4]、[1,6]左边和[1,8]相等,右区间小于8,所以两个区间都被[1,8]覆盖,最后只剩 1 个区间。
代码实现
var removeCoveredIntervals = function(intervals) {
//对区间数字进行排序,左区间相等时按右区间排倒序,不相等则按左区间排升序
intervals.sort(([l1, r1], [l2, r2]) => l1 === l2 ? r2 - r1 : l1 - l2)
//有效区间个数
let cnt = 1
//前一个右区间的值,默认为-1
let pre = -1
for (const [l, r] of intervals) {
//第一个区间只记录前一个右区间
if (pre === -1) {
pre = r
continue
}
//如果当前右区间大于前一个右区间则是有效区间
if (r > pre) cnt++
//更新前一个右区间
pre = Math.max(pre, r)
}
return cnt
};
如有错误欢迎指出,欢迎一起讨论!