zoukankan      html  css  js  c++  java
  • 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;  
        }  
  • 相关阅读:
    计算机网络【七】:可靠传输的实现 (tcp窗口滑动以及拥塞控制)【转】
    计算机网络【六】:传输层-TCP概述 【转】
    计算机网络【五】:路由选择协议 【转】
    计算机网络【三】:数据链路层 【转】
    计算机网络【二】:物理层【转】
    计算机网络【一】:概述 【转】
    装饰模式-Decorator
    Java中的文件上传和下载
    模板方法模式-TemplateMethod
    策略模式-Strategy
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4074821.html
Copyright © 2011-2022 走看看