leetcode第一刷_Insert Interval

这道题的难度跟微软的那道面试题相当。

要在集合中插入一段新的集合,相当于求两个集合的并了。对于新增加一段集合的情况,分为以下几种:

1. 增加段跟原来的全然相交,也即他的起点和终点都在被包括在原来的段中了。

这样的情况要合并这之间的段,终于增加段的起点是原来段的起点,终点是原来段的终点。

2. 增加段的起点与原来的相交。终点没有相交。终于增加的段的起点是起点相交的段的起点。终点是增加段的终点。

3. 增加段的终点与原来的相交,起点没有相交。终于增加段的起点是增加段的起点,终点是相交段的终点。

4. 增加段与原来的段没有相交。那么直接增加增加段。

在实现的时候,推断相交我用的是二分查找。对增加段的起点和终点分别查找。假设找到了的话,标记找到。并返回相交段的编号。否则的话标记未找到,返回应该插入的位置。因为函数接口要求的是返回整个更新后的段,因此除了终于增加段。要把两头的那部分没有影响到的段又一次拷贝一下。

有关后半段从哪个位置開始拷贝,分两种情况,假设终点找到了相交段,应该从相交段后面一段開始拷贝,否则的话应该从插入位置的那一段開始。

class Solution {
public:
    pair<int, int> findPos(vector<Interval> &intervals, int pos, int start, int end){
        if(start>end)   return make_pair(0, start);
        int mid = (start+end)/2;
        if(intervals[mid].start<=pos&&pos<=intervals[mid].end){
            return make_pair(1, mid);
        }else if(intervals[mid].start>pos){
            return findPos(intervals, pos, start, mid-1);
        }else if(intervals[mid].end<pos){
            return findPos(intervals, pos, mid+1, end);
        }
        return make_pair(-1, -1);
    }
    vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
        pair<int, int> lr, rr;
        int msize = intervals.size();
        vector<Interval> res;
        if(msize == 0){
            res.push_back(newInterval);
            return res;
        }
        Interval intv(0, 0);
        lr = findPos(intervals, newInterval.start, 0, msize-1);
        rr = findPos(intervals, newInterval.end, 0, msize-1);
        for(int i=0;i<lr.second;i++)
            res.push_back(intervals[i]);
        if(lr.first&&rr.first){
            intv.start = intervals[lr.second].start;
            intv.end = intervals[rr.second].end;
        }else if(lr.first&&!rr.first){
            intv.start = intervals[lr.second].start;
            intv.end = newInterval.end;
        }else if(!lr.first&&rr.first){
            intv.start = newInterval.start;
            intv.end = intervals[rr.second].end;
        }else{
            intv = newInterval;
        }
        res.push_back(intv);
        int mstart;
        if(rr.first)    mstart = rr.second+1;
        else    mstart = rr.second;
        for(int i=mstart;i<msize;i++)
            res.push_back(intervals[i]);
        return res;
    }
};


posted on 2019-04-22 14:56  xfgnongmin  阅读(105)  评论(0编辑  收藏  举报

导航