题目
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
示例
输入: [ [1,2], [2,3], [3,4], [1,3] ]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
思路
- 类似于排除最小数,采用贪心算法
- 开始先进行排序
代码
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
int n = intervals.size();
// qsort(intervals, 0, n-1); 超时
// sort(intervals, intervals+n,cmp);
sort(intervals.begin(), intervals.end(), cmp);
int f = 0;
int i = 1;
while(i<n){
if(intervals[i][0]<intervals[i-1][1]){
f++;
swap(intervals[i],intervals[i-1]);
}
i++;
}
return f;
}
static bool cmp(vector<int>& a, vector<int>& b){
return a[1]<b[1];
}
};
问题
本想练习一下快排,选用快排进行排序,结果超出时间限制
注: 快排不稳定,初始的序列有序时,时间复杂度会退化为O(n^2)。
一般选用STL中的sort()
比较保险,也节省写排序算法时间。
sort()
中对普通的快速排序进行优化,并且结合了插入排序和堆排序。
sort()
时间复杂度为n*log2(n),执行效率较高。
基本格式:
sort(begin,end,cmp); //begin,end为头、尾指针
//cmp为排序方式,定义时需要采用static
static bool cmp(type a, type b){
return a<b;
}