← 返回编程题库
coding-non-overlapping-intervals-greedy简单免费版2000ms未尝试

使区间互不相交的最少移除数

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 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

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) 上相交,必须移除其一。