leetcode Insert Interval

题目:给定一系列的区间,这些区间是不重合的,而且按每个区间的起始点排好序了。再来一个区间。怎么得到所有合并后的区间。

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

考虑周到就可以做了。我是这样想的:

1.如果给定要插入区间的开始比之前某些区间的结束还大,那之前那些区间就肯定是答案一部分。最后要判断是不是已经是结尾了,如果是,插入区间后就可以返回了。

2.再1之后就找了当前区间的结束比要插入区间的start大或者相等,这个时候肯定就存在区间合并了,那么我们先确定合并之后区间tmp的start。这个start应该是min(当前区间的start和要插入的start),在继续找到tmp的end就完成了重复区间的合并。

3.找end,一直往后找,知道找到一个end比要插入的end大,那么这个时候要看要插入的end是不是在找到的这个区间中,如在,那么tmp的end显然就是现在遍历到的end。否则tmp的end就是要出入的end。

4.记得找到end后要把剩下的区间(如果有的话)记录。

/**

 * 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:

vector<Interval> insert(vector<Interval> &intervals, Interval newInterval)

{

    vector<Interval> ans;

    vector<Interval>::iterator p = intervals.begin();

    Interval tmp;

    while (p != intervals.end() && (*p).end < newInterval.start)

        ans.push_back(*p++); // 找到newInterval起点大的区间,如果有没有,就直接如下输出答案

    if (p == intervals.end()) 

    {

        ans.push_back(newInterval);

        return ans;

    }

    tmp = *p; // tmp主要用来记录跨越区间的起点和终点

    if((*p).start > newInterval.start) 

        tmp.start = newInterval.start; // 确定起点

    while(p!=intervals.end() && (*p).end < newInterval.end) 

        p++;

    if(p == intervals.end()) 

    {

        tmp.end = newInterval.end;

        ans.push_back(tmp);

        return ans;

    }

    if((*p).start <= newInterval.end) // 如果end在区间内,那么确定tmp的end后把剩下的区间也记录到答案中输出

    {

        tmp.end = (*p).end; ans.push_back(tmp);

        while(++p != intervals.end()) ans.push_back(*p);

        return ans;

    }

    tmp.end = newInterval.end;ans.push_back(tmp); // end不在区间内,那end就是tmp的end了,再把剩下的区间记录

    while(p!=intervals.end()) ans.push_back(*p++);

    return ans;

}

};

这个大神的解法写的比较简洁。他的思路是最后找要插入的区间的end是否大于某个区间的start来判断,而我是用end。

直接贴过来吧

vector<Interval> insert(vector<Interval> &v, Interval nv)   

    {  

        vector<Interval> rs;  

        int i = 0;  

        for ( ; i < v.size() && v[i].end < nv.start; i++)  

        {  

            rs.push_back(v[i]);  

        }  

        if (i == v.size())  

        {  

            rs.push_back(nv);  

            return rs;  

        }  

        nv.start = min(nv.start, v[i].start);  

  

        for ( ; i < v.size() && v[i].start <= nv.end; i++)  

        {  

            nv.end = max(nv.end, v[i].end);  

        }  

        rs.push_back(nv);  

  

        for ( ; i < v.size(); i++)  

        {  

            rs.push_back(v[i]);  

        }  

        return rs;  

    }  

 

你可能感兴趣的:(LeetCode)