leetcode-non-overlapping-intervals

题目大意

  https://leetcode.com/problems/non-overlapping-intervals/

  很经典的贪心算法实例,任务选择 Activity Selection

题目分析

  第一种思路是按结束时间从小到大排序。策略是后加入的任务如果开始时间比上一任务结束时间早,那么舍弃,否则方案数加一。

  第二种思路是按开始时间排序。策略是后加入的任务如果结束时间比上一任务结束时间早,那么替换上一任务。否则要判断新加入的任务如果开始时间比上一任务结束时间晚,那么方案数加一。

代码

  第一种思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
static bool mysort(Interval& a, Interval& b){
return a.end < b.end;
}
int eraseOverlapIntervals(vector<Interval>& intervals) {
int len = intervals.size();
if (len <= 1) {
return 0;
}
std::sort(intervals.begin(), intervals.end(), mysort);
int loc = 0;
int count = 1;
for (int i = 1; i < len; i++) {
if (intervals.at(i).start >= intervals.at(loc).end) {
loc = i;
count++;
}
}
return len - count;
}
};

  时间复杂度 O(n * log(n))


  第二种思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
static bool mysort(Interval& a, Interval& b){
return a.start < b.start;
}
int eraseOverlapIntervals(vector<Interval>& intervals) {
int len = intervals.size();
if (len <= 1) {
return 0;
}
std::sort(intervals.begin(), intervals.end(), mysort);
int loc = 0;
int count = 1;
for (int i = 1; i < len; i++) {
if (intervals.at(i).end < intervals.at(loc).end) {
loc = i;
} else if (intervals.at(i).start >= intervals.at(loc).end) {
count++;
loc = i;
}
}
return len - count;
}
};

  时间复杂度 O(n * log(n))