本题给出一个数组,其中每个元素都包含一个开始和结束时间,要求在这个数组中删除最少的元素来使得整个数组中所有的活动没有重合。
本题就是一段时间内所能安排最大活动数目的简单变形,需要应用贪心思想来解决,首先将所有的interval按结束时间排序,排第一的interval一定保证,然后逐个检查,如果和上一个安排的活动没有重合(开始时间不小于上次安排的活动的结束时间)就也要保证,遍历完整个数组,就能求出要删除多少interval了。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
using namespace std;
struct Interval {
int start;
int end;
Interval() : start(0), end(0) {}
Interval(int s, int e) : start(s), end(e) {}
};
class Solution {
static bool cmp(const Interval& a, const Interval& b) {
return a.end < b.end;
}
public:
int eraseOverlapIntervals(vector<Interval>& intervals) {
if (intervals.empty())
return 0;
sort(intervals.begin(), intervals.end(), cmp);
int n = int(intervals.size());
int lastEnd = intervals.front().start;
for (auto interval : intervals) {
if (interval.start >= lastEnd) {
lastEnd = interval.end;
n--;
}
}
return n;
}
};
int main(int argc, char const *argv[]) {
Solution s;
Interval a[5] = {Interval(1, 2), Interval(2, 3), Interval(3, 4), Interval(-100, -2), Interval(5, 7)};
vector<Interval> intervals(a, a + 5);
cout << s.eraseOverlapIntervals(intervals) << endl;
system("pause");
return 0;
}
这次刷到一个贪心的题目,做题时已经知道解题思路,解决起来很快。但是我觉得贪心和动态规划这两种题变化万千,指向性也没有图的题目那么明确,以后还需要多加练习,遇到不好解决的问题,可以试试往贪心或者动态规划上思考。