【leetcode】Insert Interval

来源:互联网 发布:数据库备份服务器 编辑:程序博客网 时间:2024/05/16 06:39

原题:

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


分析:题意比较容易理解,题目中关键一点是所有输入的intervals没有重叠且已排好序。因此在插入时,先后考虑待插入元素的star和endt的位置。

具体地,先将start(待插入元素的start,以下默认,包括end)依次与各个interval比较,如果总是在interval 的右侧,则将interval push进ret;

反之,则比较start与interval.start的相对大小,取较小值作为待插入元素的start,然后再查找end与interval的相对位置,如果end总是在interval的右侧,则i++;反之,若end在interval之间,则取interval.end作为待插入元素的end,若end在interval左侧,则取end作为待插入元素的end,同时i--。

再依次处理剩余的元素。



代码:

class Solution {public:    int CheckInterval(int n,Interval intervalT)    {        if(n < intervalT.start){//left            return 1;        }        if(n>=intervalT.start && n<=intervalT.end){//mid            return 2;        }        if(n > intervalT.end){//right            return 3;        }        return -1;    }    vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {        // IMPORTANT: Please reset any member data you declared, as        // the same Solution instance will be reused for each test case.        vector<Interval> ret;        if(intervals.size() == 0){            ret.push_back(newInterval);            return ret;        }        bool insertFlag = false;        Interval tempInterval;        for(vector<Interval>::size_type i=0 ; i!=intervals.size() ; i++){            if(insertFlag == true){                ret.push_back(intervals[i]);            }            else{                if(CheckInterval(newInterval.start,intervals[i]) == 3){                    ret.push_back(intervals[i]);                    continue;                }                else if(CheckInterval(newInterval.start,intervals[i]) == 1){                        tempInterval.start = newInterval.start;                    }                else {                    tempInterval.start = intervals[i].start;                }                while(CheckInterval(newInterval.end,intervals[i])==3 && i!=intervals.size()){                    i++;                }                if(i == intervals.size()){                    tempInterval.end = newInterval.end;                    ret.push_back(tempInterval);                    insertFlag = true;                    break;                }                if(CheckInterval(newInterval.end,intervals[i]) == 1){                    tempInterval.end = newInterval.end;                    ret.push_back(tempInterval);                    insertFlag = true;                    i--;                }                else if(CheckInterval(newInterval.end,intervals[i]) == 2){                    tempInterval.end = intervals[i].end;                    ret.push_back(tempInterval);                    insertFlag = true;                }            }        }        if(insertFlag == false){            ret.push_back(newInterval);        }        return ret;    }};


总结:关键是理清思路。另外要注意intervals为空和newInterval在最后的情况要特别处理。


后续:

觉得自己的代码有点繁琐,在网上参考了下别人的解法,有一个很好的很简洁的代码:

class Solution {public:    vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {        // IMPORTANT: Please reset any member data you declared, as        // the same Solution instance will be reused for each test case.        int i = 0;        int n = intervals.size();        vector<Interval> ret;        while(i<n && newInterval.start>intervals[i].end){            ret.push_back(intervals[i]);            i++;        }        while(i<n && newInterval.end>=intervals[i].start){            newInterval.start = min(newInterval.start,intervals[i].start);            newInterval.end = max(newInterval.end,intervals[i].end);            i++;        }        ret.push_back(newInterval);        while(i<n){            ret.push_back(intervals[i]);            i++;        }        return ret;    }};

其首先是将newInterval左侧的interval插入ret,直到newInterval.start<intervals[i].end,即新interval可以合并,然后查找新interval的end,通过max和min函数可以很巧妙的简化代码。



原创粉丝点击