1. question: 无重叠区间(中等)
给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/non-overlapping-intervals
示例 1:
1 | 输入: intervals = [[1,2],[2,3],[3,4],[1,3]] |
示例 2:
1 | 输入: intervals = [ [1,2], [1,2], [1,2] ] |
示例 3:
1 | 输入: intervals = [ [1,2], [2,3] ] |
提示:
1 | 1 <= intervals.length <= 105 |
2. answers
这道题和引爆气球类似,但是不好转换。还是采用贪心策略比较直观。
首先目的是要删除最小的重叠区间,使得剩余区间互相独立。因为区间数 = 重叠数 + 独立数。所以删除最少的,那么就是独立数最多。
我们是在X轴上放置尽可能多的区间,因此,在放置区间的时候,要保证剩余空间尽可能大,(注意,这里不能优先放置区间范围小的,因为ABC区间,B和AC都重叠,但是B最小,显然这不符合要求)。
那么怎么保证剩余空间尽可能大呢?应该从一侧开始放置,以左侧为例,优先放置右边界小的区间。这样,即使[8, 9]的区间范围小,但是[2, 7]的右边界小,显然剩余的空间更大。
因此,
- 按照右边界升序排序。
- 从左向右遍历,判断是否和上一个独立空间重叠,重叠则去掉本元素(计数加1)。
- 不重叠则更新临近的右边界值。
1 | public class Solution_0105 { |
3. 备注
参考力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 (leetcode-cn.com),代码随想录 (programmercarl.com)。