一、题目描述——原题链接
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:
You may assume the interval’s end point is always bigger than its start point.
Intervals like [1,2] and [2,3] have borders “touching” but they don’t overlap each other.
Example 1:
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.
Example 2:
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.
Example 3:
Input: [ [1,2], [2,3] ]
Output: 0
Explanation: You don't need to remove any of the intervals since they're already non-overlapping.
二、题目分析
这就是老师上课讲的排时间的问题,按照如下思路解决:先按照interval的结束时间进行从小到大的排序,再遍历一遍已经排序好的数据,用一个值记录结束时间,当结束时间大于一个interval的开始时间时,将该结束时间置为interval的结束时间。
三、源代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Interval {
int start;
int end;
Interval() : start(0), end(0) {}
Interval(int s, int e) : start(s), end(e) {}
};
int eraseOverlapIntervals(vector<Interval>& intervals);
bool interval_compare(Interval & i1, Interval & i2);
int main()
{
vector<Interval> intervals;
/*input data:
[ [1,2], [2,3], [3,4], [1,3] ]
[ [1,2], [1,2], [1,2] ]
[ [1,2], [2,3] ]
*/
string input = "[ [1,2], [2,3] ]";
int count = 0;
int a;
for(int i = 0; i < input.length(); i ++)
{
if(isdigit(input[i]))
{
count ++;
if(count == 1)
a = (int)input[i] - 48;
if(count == 2)
{
Interval temp(a, (int)input[i] - 48);
intervals.push_back(temp);
count = 0;
}
}
}
cout << eraseOverlapIntervals(intervals) << endl;
}
bool interval_compare(Interval & i1, Interval & i2)
{
return i1.end < i2.end;
}
int eraseOverlapIntervals(vector<Interval>& intervals)
{
int erase_num = 0;
sort(intervals.begin(), intervals.end(), interval_compare);
int max = -1;
for(int i = 0; i < intervals.size(); i ++)
{
if(intervals[i].start >= max)
max = intervals[i].end;
else
{
erase_num ++;
cout << intervals[i].start << "," << intervals[i].end << endl;
}
}
return erase_num;
}