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

思路:

分3种情况讨论:

首先,如果插入的元素的start一直大于上一个的结束end,那么说明还没找到要插入的位置;

如果找到要插入的位置,即有start小于end。如果要插入的元素的end也小于找到要插入点的start,说明没有交集,直接将元素插入,设置标志位用来控制该新插入的元素只插入一次。

否则,如果插入的元素与后一个区间有交集,则将新插入的元素与后一个区间合并成新的要插入的元素,继续重复上面的过程。记得要判断flag看要插入的元素是否插入了。

C++实现代码:

#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) {}
};

class Solution
{
public:
    vector<Interval> insert(vector<Interval> &intervals, Interval newInterval)
    {
        vector<Interval> ret;
        if(intervals.empty())
        {
            ret.push_back(newInterval);
            return ret;
        }
        int flag=0;
        int i;
        for(i=0; i<(int)intervals.size(); i++)
        {
            if(newInterval.start>intervals[i].end)
            {
                ret.push_back(intervals[i]);
            }
            else if(newInterval.end<intervals[i].start)
            {
                if(flag==1)
                    ret.push_back(intervals[i]);
                else
                {
                    flag=1;
                    ret.push_back(newInterval);
                    ret.push_back(intervals[i]);
                }
            }
            else
            {
                newInterval.start=min(newInterval.start,intervals[i].start);
                newInterval.end=max(newInterval.end,intervals[i].end);
            }
        }
        if(flag==0)
            ret.push_back(newInterval);
        return ret;
    }
};

int main()
{
    Solution s;
    Interval a1(1,2);
    Interval a2(3,5);
    Interval a3(6,7);
    Interval a4(8,10);
    Interval a5(12,16);
    vector<Interval> intervals= {a1,a2,a3,a4,a5};
    Interval newInternal= {0,0};
    vector<Interval> result=s.insert(intervals,newInternal);
    for(auto a:result)
        cout<<"[ "<<a.start<<" , "<<a.end<<" ]"<<endl;
}

运行结果:

Insert Interval_第1张图片

 

class Solution {
public:
    vector<Interval> insert(vector<Interval> &intervals, Interval newInterval)
    {
        if(intervals.empty())
            return vector<Interval>({newInterval});
        vector<Interval> res;
        int i;
        int flag=false;
        for(i=0; i<intervals.size(); ++i)
        {

            if(intervals[i].end<newInterval.start)
            {
                res.push_back(intervals[i]);
            }
            else if(newInterval.end<intervals[i].start)
            {
                flag=true;
                res.push_back(newInterval);
                break;
            }
            else
            {
                newInterval.start=min(newInterval.start,intervals[i].start);
                newInterval.end=max(newInterval.end,intervals[i].end);
            }
        }
        for(;i<intervals.size();i++)
            res.push_back(intervals[i]);
        if(!flag)
            res.push_back(newInterval);
        return res;
    }
};

 

你可能感兴趣的:(insert)