57. Insert Interval

37 篇文章 0 订阅
12 篇文章 0 订阅

        这道题刚开始有点难想清楚,所以,代码上可能就会比较麻烦,但是一旦想清楚了,就会简单很多。个人感觉难度不算太大。

        题目大体意思:给定一组互不相交的升序区间,再给定一个需要加入该组的区间,求出最终的包含的区间范围,要求如何新加入的区间与原有区间之间出现了重叠,就将其合并,从而得到最终结果。比如:原本的区间是包含:[1, 5],[6, 7] 给定的新区间[2,6],则最终的结果应该是[1, 7];

         思路描述:

         <1>、因为原本的区间组是升序排列的,因此,先将我们的新区间和原数组的起始点比较大小,插入原区间组中,保证各个区间的起始点是呈现有序的,此时,比如继续使用上面的例子,就得到了 [1, 5],[2, 6],[6, 7] 这样一个组合。

         <2>、而后我们开始遍历整个数组,对可以合并的区间进行合并,这块代码有多种实现方式,大家可以自行设计,这里我参考了大神的代码,做了一下操作,具体看代码,思路是,先找到一个区间的起始点和终止点,而后来对比下一个区间,如何发现下一个区间与该区间能融合,就将终止点变为下一个区间的终止点,起始点不变,直到出现区间不重合的时候,将目前求出的起点和终点组成的新区间放入结果中,比如继续上面的例子,第一步,起点start = 1, 终点end = 5,到达第二块区间,发现可以融合,则start不变,end变为6,到达第三个区间,发现还能融合,end变为7,最终合成区间start=1,end=7。

AC代码如下所示:

/**
 * 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) {
        if (intervals.size() < 1) {
            return vector<Interval> (1, newInterval);
        }
        int i=0;
        for (i=0; i<intervals.size(); ++i) {
            if (newInterval.start < intervals[i].start) {
                
                break;
            }
        }
        intervals.insert(intervals.begin()+i, newInterval);
        
        vector<Interval> res;
        int starts = intervals[0].start, ends = intervals[0].end;
        for (i=1; i<intervals.size(); ++i) {
            if (intervals[i].start <= ends) {
                ends = max(ends, intervals[i].end);
            } else {
                res.emplace_back(Interval(starts, ends));
                starts = intervals[i].start;
                ends = intervals[i].end;
            }
        }
        res.emplace_back(starts, ends);
        return res;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值