题目描述
给定多个区间,计算让这些区间不重叠所需要移除的最少个数。起止相连不算重叠。
输入输出样例
&emps;输入是一个数组,数组由多个长度固定为2的数组组成,表示区间的开始和结尾。输出一个整数,表示需要移除的区间数量。
Input: [[1,2], [2,4], [1,3]]
Output: 1
在这个样例中,我们可以移除区间[1,3],使得剩余的区间[[1,2],[2,4]]互不重叠。 # 题解 在选择要保留区间时,区间的结尾十分重要:选择的区间结尾越小,余留给其它区间的空间就越大,就越能保留更多的区间。因此,我们采取的贪心策略为:优先保留结尾小且不相交的区间。 具体实现方法为,先把区间按照结尾的大小进行增序排序,每次选择结尾最小且和前一个选择的区间不重叠的区间。我们这里使用C++的Lambda,结合std::sort()函数进行自定义排序。 在样例中,排序后的数组为[[1,2],[1,3],[2,4]].按照我们的贪心策略,首先初始化为区间[1,2];由于[1,3]与[1,2]相交,我们跳过该区间;由于[2,4]与[1,2]不相交,我们将其保留。因此最终保留的区间为[[1,2],[2,4]]。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public: int eraseOverlapIntervals(vector<vector<int>>& intervals) { if (intervals.empty()) return 0; int n = intervals.size(); sort(intervals.begin(),intervals.end(),[&](vector<int> A,vector<int> B){return A[1] < B[1];}); int total = 0,prev = intervals[0][1]; for (int i = 1; i < n; i++) { if (intervals[i][0] < prev) ++total; else prev = intervals[i][1]; } return total; } };
|