Leetcode-435-无重叠区间
题目链接
题目描述
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 没有重叠。
要求
O(n)的时间复杂度。
思路
贪心
-
去掉的区间尽可能少,即剩余的区间尽可能多。
-
按照区间的 左 端点升序,遍历区间,要想剩下的区间尽可能多,
则发生冲突时,应该选择 右 端点尽可能小的的区间留下。
这样,后面才有更多的可能容纳更多的区间。。 -
如:
{1,4} {3,5} 留下
C++代码
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& a) {
sort(a.begin(), a.end());
int n = a.size();
int ans = 0, R = a[0][1]; // R 记录上个区间的右端点。
for (int i = 1; i < n; i++) {
if (a[i][0] < R) {
ans ++;
if (a[i][1] < R) // 去掉右端点大的区间,更新R
R = a[i][1];
}
else
R = a[i][1];
}
return ans;
}
};