-
leetcode:地址
-
问题描述:给定一个区间集合,尝试删除最少数量的区间使得所有区间不重合,求最小区间数。
-
输入输出样例:
- 输入:[ [1,2], [2,3], [3,4], [1,3] ]
- 输出:1
- 解释:删除一个区间[1,3]后所有区间均不重合。
-
分析:贪心算法(局部最优 到全局最优)
-
c++代码
- 注意:代码中用到c++11标准中的匿名函数,关于匿名函数详细可以查看。
struct Interval {
int start;
int end;
Interval() : start(0), end(0) {}
Interval(int s, int e) : start(s), end(e) {}
};
class Solution {
public:
int non_overlap_intervals(vector<Interval>& intervals)
{
auto comp = [](const Interval& interval_1, const Interval& interval_2) {return interval_1.start < interval_2.start; };
sort(intervals.begin(), intervals.end(), comp);
int res = 0, pre = 0;
for (int i = 1; i < intervals.size(); i++)
{
if (intervals[i].start < intervals[pre].end)
{
res++;
if (intervals[i].end < intervals[pre].end)
pre = i;
}
else
pre++;
}
return res;
}
};
主调函数:
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
int main(int argc, char* argv[])
{
vector<Interval> intervals = {Interval(1, 2),Interval(2, 3), Interval(3,4), Interval(1, 3)};
Solution solution;
cout<< "Need Remove " <<solution.non_overlap_intervals(intervals) << " intervals"<<endl;
system("pause");
return 0;
}