435. 无重叠区间
1.题目描述
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
示例 1:
示例 2:
示例 3:
2.思路
1.先计算最多能组成的不重叠区间个数,然后用区间总个数减去不重叠区间的个数。在每次选择中,区间的结尾最为重要,选择的区间结尾越小,留给后面的区间的空间越大,那么后面能够选择的区间个数也就越大。
2.按区间的结尾进行排序,每次选择结尾最小,并且和前一个区间不重叠的区间。
3.代码
class Solution {
public:
static bool cmp(vector<int>& vec1,vector<int>& vec2){
return vec1[1] < vec2[1];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.empty()){
return 0;
}
sort(intervals.begin(),intervals.end(),cmp);
int end = intervals[0][1];//保存每个区间的结束
int count = 1;
for(int i = 1;i < intervals.size();++i){
if(intervals[i][0] >= end){
count++;
end = intervals[i][1];
}
}
return intervals.size() - count;
}
};
4.复杂度分析
时间复杂度:O(nlogn),快速排序的时间复杂度是O(nlogn)
空间复杂度:O(1)