使区间互不相交的最少移除数
Min Intervals To Remove For Non-Overlap
开始编码给定一组整数区间 intervals,每个 intervals[k] = [start, end] 满足 start ≤ end。两个区间 [a, b] 与 [c, d] 相交当且仅当其开区间内部相交,即 a < d 且 c < b。在单个端点处相切(例如 [1, 2] 与 [2, 3] 在 2 相遇)不算相交。返回最少需移除多少个区间,才能使剩下的区间两两不相交。
请实现 solution(intervals: list[list[int]]) -> int,返回最少移除个数。这是 LeetCode 435 的原题——所求答案是移除数而非保留集合本身,但二者互为对偶:最小移除数 = N − 最大互不相交子集大小。
示例:solution([[1,2],[2,3],[3,4],[1,3]]) 返回 1——保留 [1,2], [2,3], [3,4](相切允许),移除横跨的 [1,3]。solution([[1,2],[1,2],[1,2]]) 返回 2——三个完全相同的区间两两相交,保留 1 个,移除 2 个。solution([[1,2],[2,3]]) 返回 0——在 2 相切不算相交,两个都保留。
预期算法是先对保留问题做区间调度极大化,再做减法:按 end 升序排序,贪心选择下一个 start ≥ 上一个保留区间 end 的区间,记保留个数为 K,返回 len(intervals) − K。时间复杂度 O(n log n),瓶颈在排序;扫描是 O(n),原地排序时额外空间 O(1)。「最小移除数」框架在调度与准入控制类场景里最自然:你有一份必要但相互冲突的候选时段清单,单资源一次只能服务一个,运营关心的是「我得砍掉多少」。每个被移除的区间就是一次取消;答案就是化解所有冲突所需的最小取消预算。
约束条件
- 0 ≤ len(intervals) ≤ 10⁴
- 每个 `intervals[k] = [start, end]` 满足 `0 ≤ start ≤ end ≤ 10⁹`
- 在单个端点处相切**不算**重叠(`[1, 2]` 与 `[2, 3]` 可同时保留)
- 返回 `int` 类型,精确比较,不涉及浮点容差
样例
Case 1 · LC 435 example — keep three touching, drop the spanner
输入: [[[1,2],[2,3],[3,4],[1,3]]]
期望: 1
保留 [1,2],[2,3],[3,4](端点相切允许),移除横跨的 [1,3]。最大保留 K=3,故移除数为 4−3=1。
Case 2 · three identical intervals — keep one
输入: [[[1,2],[1,2],[1,2]]]
期望: 2
三个完全相同的区间两两相交,最多保留 1 个,其余 2 个必须移除。
Case 3 · two touching at a point — keep both
输入: [[[1,2],[2,3]]]
期望: 0
[1,2] 与 [2,3] 仅在端点 2 相切,不算相交,两个都保留,移除数为 0。
Case 4 · four nested intervals sharing common segment
输入: [[[0,10],[1,9],[2,8],[3,7]]]
期望: 3
四个区间都包含 [3,7),两两相交,最多保留 1 个,其余 3 个必须移除。
Case 5 · two overlap by one unit
输入: [[[1,3],[2,4]]]
期望: 1
[1,3] 与 [2,4] 在 (2,3) 上相交,必须移除其一。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · LC 435 example — keep three touching, drop the spanner
输入: [[[1,2],[2,3],[3,4],[1,3]]]
期望: 1
保留 [1,2],[2,3],[3,4](端点相切允许),移除横跨的 [1,3]。最大保留 K=3,故移除数为 4−3=1。
Case 2 · three identical intervals — keep one
输入: [[[1,2],[1,2],[1,2]]]
期望: 2
三个完全相同的区间两两相交,最多保留 1 个,其余 2 个必须移除。
Case 3 · two touching at a point — keep both
输入: [[[1,2],[2,3]]]
期望: 0
[1,2] 与 [2,3] 仅在端点 2 相切,不算相交,两个都保留,移除数为 0。
Case 4 · four nested intervals sharing common segment
输入: [[[0,10],[1,9],[2,8],[3,7]]]
期望: 3
四个区间都包含 [3,7),两两相交,最多保留 1 个,其余 3 个必须移除。
Case 5 · two overlap by one unit
输入: [[[1,3],[2,4]]]
期望: 1
[1,3] 与 [2,4] 在 (2,3) 上相交,必须移除其一。