题目描述
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:可以认为区间的终点总是大于它的起点。区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
示例 1:
输入: [ [1,2], [2,3], [3,4], [1,3] ] 输出: 1
示例 2:
输入: [ [1,2], [1,2], [1,2] ] 输出: 2
示例 3:
输入: [ [1,2], [2,3] ] 输出: 0
思路分析
可使用贪心算法,先按照各数组单元起点排序,然后如果数组区间有重叠,则选择数组区间结束值最小的,后续才可能连接更多的区间。
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.size() == 0)
return 0;
int res = 0;
//按照数组起始值大小排序
sort(intervals.begin(),intervals.end(),[](const vector<int> & i1,const vector<int> &i2)
{
return i1[0] < i2[0];
});
int end = intervals[0][1]; //初始化存放最小结束值的变量end为第一个数组单元的结束值
for(int i = 1;i < intervals.size();i++)
{
//从第二个数组单元开始,检查后续数组单元是否有重叠
if(intervals[i][0] < end) //有重叠
{
++res;
end = min(intervals[i][1],end); //更新end值保持最小
}
else
end = intervals[i][1];
}
return res;
}
};