56. Merge Intervals

来源:互联网 发布:淘宝书城 编辑:程序博客网 时间:2024/06/06 05:45

题目

Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

思路

本题,说难不难,说简单也不简单,就是稍稍有些绕,特此总结一个清晰的思路,如下:

step1:首先对vector<Interval> 进行排序,这里的compare函数需要自己写,如下:

struct myclass {        bool operator() (Interval i,Interval j)  { return (i.start<j.start); }        } myobject; sort(intervals.begin(),intervals.end(),myobject);

step2:然后维护两个变量start和end,来标记当前数组的起始与结束的位置,遍历数组,遍历的过程中需要判断相邻两个数组之间是否有重叠,重叠的触发条件如下:

intervals[i].end>=intervals[i+1].start

step3 :如果没有重叠,更新start、end并添加Interval,如果存在重叠,同样更新start、end;
step4:调出循环,添加临界数组即末尾数组

代码

/** * 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:    struct myclass {        bool operator() (Interval i,Interval j)  { return (i.start<j.start); }        } myobject;            vector<Interval> merge(vector<Interval>& intervals) {        vector<Interval> res;        if(intervals.empty())            return res;        Interval temp;        sort(intervals.begin(),intervals.end(),myobject);//排序        int start=intervals[0].start,end = intervals[0].end;        //重叠的触发条件:intervals[i].end>=intervals[i+1].start        for(int i=0;i<intervals.size()-1;i++)        {            if(intervals[i].end<intervals[i+1].start)            {                temp.start = start;                temp.end = intervals[i].end;                res.push_back(temp);                start = intervals[i+1].start;                end = intervals[i+1].end;            }            else//发生重叠            {                if(intervals[i].end>=intervals[i+1].end)                {                    start = intervals[i].start;                    end = intervals[i].end;                    intervals[i+1].start = start;                    intervals[i+1].end = end;                }                else                {                    start = intervals[i].start;                    end = intervals[i+1].end;                    intervals[i+1].start = start ;                    intervals[i+1].end = end;                }            }        }        temp.start = start;        temp.end = intervals[intervals.size()-1].end;        res.push_back(temp);        return res;     }};
原创粉丝点击