算法分析与设计课程17——435. Non-overlapping Intervals

来源:互联网 发布:httppost请求发送json 编辑:程序博客网 时间:2024/06/14 03:36

一、题目描述——原题链接

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: 1Explanation: [1,3] can be removed and the rest of intervals are non-overlapping.

Example 2:

Input: [ [1,2], [1,2], [1,2] ]Output: 2Explanation: You need to remove two [1,2] to make the rest of intervals non-overlapping.

Example 3:

Input: [ [1,2], [2,3] ]Output: 0Explanation: 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;}