Leetcode 435. Non-overlapping Intervals
题目描述
Given a collection of intervals, find the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping.
Note:
1. You may assume the interval’s end point is always bigger than its start point.
2. Intervals like [1,2] and [2,3] have borders “touching” but they don’t overlap each other.
输入:一组序列,为活动的起始时间与结束时间
输出:需要剔除的最小活动数量
如:
Input: [ [1,2], [2,3], [3,4], [1,3] ]
Output: 1
Explanation: [1,3] can be removed and the rest of intervals are non-overlapping.
Input: [ [1,2], [1,2], [1,2] ]
Output: 2
Explanation: You need to remove two [1,2] to make the rest of intervals non-overlapping.
思路
贪心算法:相当于使不冲突的活动数量最大,考虑下面的贪心-活动-选择算法,该算法需要先对活动以完成时间为key排序。应用于本提时,只需在满足不冲突条件时,使最大活动数量
+1,最终通过活动数量-最大活动数量 = 剔除数量
即可。其中,排序为O(nlogn)
,比较为O(n)
,最终复杂度为O(nlogn)
。
Greedy-acitivity-selector(s,f)
n <- length[s]
A <- {a1}
i <- 1
for m <- 2 to n
do if sm >= fi then A <- A U {am}, i <- m
return A
代码
/**
* 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 comp(Interval a, Interval b){
return a.end<b.end;
}
//vector<Interval> sat; //for hold the satisfied intervals
int ind;//the index of last satisfied activity
int sats;//the size of satisfied activity
int eraseOverlapIntervals(vector<Interval>& intervals) {
int size = intervals.size();
sort(intervals.begin(),intervals.end(), comp);
for(int m=0;m<intervals.size();m++){
if(sats==0/*sat.empty()*/){
//init
ind = 0;
sats = 1;
//sat.push_back(intervals[m]);
}else{
//greed step
if(intervals[ind].end<=intervals[m].start){
ind = m;
sats++;
//sat.push_back(intervals[m]);
}
}
}
return size-sats;
}
};