leetcode 56. Merge Intervals 57. Insert Interval

来源:互联网 发布:前方交会编程 编辑:程序博客网 时间:2024/05/14 19:05

56. Merge Intervals

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].

方法一:先按照start位置排序,然后挨个比较与身后的关系,如果可以合并就合并,然后删除后面一个。

方法二:建立一个ret数组,然后往里面放,就可以不用删除。


/** * Definition for an interval. * struct Interval { *     int start; *     int end; *     Interval() : start(0), end(0) {} *     Interval(int s, int e) : start(s), end(e) {} * }; */ bool comp(Interval &a,Interval &b){    return a.start < b.start;}class Solution {public:    vector<Interval> merge(vector<Interval>& intervals)     {         //way-1         /*         if(intervals.size() == 0)              return intervals;         sort(intervals.begin(), intervals.end(), comp);         for (int i = 0; i < intervals.size() - 1; i++)         {             if (intervals[i+1].start > intervals[i].end)                 continue;             else if (intervals[i+1].start <= intervals[i].end)             {                 intervals[i].end = max(intervals[i+1].end, intervals[i].end);                 intervals.erase(intervals.begin() + i + 1);                 i--;             }         }         return intervals;         */                  //way-2         if (intervals.size() == 0)              return intervals;         sort(intervals.begin(), intervals.end(), comp);         vector<Interval> ret;         ret.push_back(intervals[0]);         for (int i = 1; i < intervals.size(); i++)         {             if (intervals[i].start <= ret[ret.size()-1].end)                 ret[ret.size()-1].end = max(ret[ret.size()-1].end, intervals[i].end);             else                 ret.push_back(intervals[i]);         }         return ret;    }};

57. Insert Interval

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

You may assume that the intervals were initially sorted according to their start times.

Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

way-1 : 先把新的插入,然后合并用merge

way-2:不排序,直接插入。分别处理好 插入左边,插入中间,插入右边的情况就行!

/** * Definition for an interval. * struct Interval { *     int start; *     int end; *     Interval() : start(0), end(0) {} *     Interval(int s, int e) : start(s), end(e) {} * }; */ bool comp(Interval &a,Interval &b){    return a.start<b.start; }class Solution {public:    vector<Interval> insert(vector<Interval>& intervals, Interval newInterval)     {        //way-1        /*        intervals.push_back(newInterval);        return merge(intervals);        */                 //way-2        vector<Interval> ret;        int k = 0;                 while (k < intervals.size() && intervals[k].end < newInterval.start)            ret.push_back(intervals[k++]);                 ret.push_back(newInterval);        while(k < intervals.size() && intervals[k].start <= ret[ret.size()-1].end)        {            ret[ret.size()-1].start = min(ret[ret.size()-1].start, intervals[k].start);            ret[ret.size()-1].end = max(ret[ret.size()-1].end, intervals[k].end);            k++;        }                 while(k < intervals.size())            ret.push_back(intervals[k++]);                     return ret;         }        vector<Interval> merge(vector<Interval>& intervals)     {        sort(intervals.begin(), intervals.end(), comp);        vector<Interval> ret;        ret.push_back(intervals[0]);                 for(int i = 1; i < intervals.size(); i++)        {            if (intervals[i].start <= ret[ret.size()-1].end)                ret[ret.size()-1].end = max(ret[ret.size()-1].end, intervals[i].end);            else                ret.push_back(intervals[i]);        }        return ret;    }};











阅读全文
0 0
原创粉丝点击