Non-overlapping Intervals
A.题意
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.Example:
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.
Input: [ [1,2], [2,3] ]
Output: 0
Explanation: You don’t need to remove any of the intervals since they’re already non-overlapping.
题目的大概意思就是给你一些区间让你去除一些区间使得区间之间没有重叠(端点可重叠)
B.思路
这道题的思路类似于算法导论中那道安排会议在同一个场所,这里我们使用最早结束贪心规则
C.代码实现
/**
* 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:
int eraseOverlapIntervals(vector<Interval>& intervals) {
int n = intervals.size();
if (n == 0) return 0;
sort(intervals.begin(),intervals.end(),comp);
int count = 1;
int tempEnd = intervals[0].end;
for (int i = 1;i < n;i++)
{
Interval temp = intervals[i];
if (temp.start >= tempEnd)
{
count++;
tempEnd = temp.end;
}
}
return n - count;
}
static bool comp(const Interval& a,const Interval& b)
{
return a.end < b.end || (a.start < b.start && a.end == b.end);
}
};