【简单】Lintcode 30:Insert Interval

本文介绍了一种区间合并算法,该算法用于将一个新区间插入到已排序且无重叠的区间列表中,并确保合并后的区间列表依然保持有序及非重叠状态。通过具体的示例演示了如何处理新区间与原有区间存在重叠的情况,提取出重叠区间的最小开始值与最大结束值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a non-overlapping interval list which is sorted by start point.

Insert a new interval into it, make sure the list is still in order and non-overlapping (merge intervals if necessary).

Example

Insert [2, 5] into [[1,2], [5,9]], we get [[1,9]].

Insert [3, 4] into [[1,2], [5,9]], we get [[1,2], [3,4], [5,9]].

解题思路:

1、这道题一开始摸不着头脑,通过查看各位高手的代码,略懂。

2、简单的情况是插入一个原本就不重复的interval list,直接放在后面即可。

3、比较难的情况是插入一个有重复的元素,这时需要提取出重复两组元素start中最小的值与end中最大的值,防止数值重复。语言解释不太明白,具体看代码。

/**
 * Definition of Interval:
 * class Interval {
 * public:
 *     int start, end;
 *     Interval(int start, int end) {
 *         this->start = start;
 *         this->end = end;
 *     }
 * }
 */


class Solution {
public:
    /*
     * @param intervals: Sorted interval list.
     * @param newInterval: new interval.
     * @return: A new interval list.
     */
    vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) 
    {
        // write your code here
        vector<Interval> &a = intervals;
        Interval b = newInterval;
        int i=0;
        
        vector<Interval> ans;

        //当插入元素不重复时,一次提取
        while(i<a.size() && a[i].end < b.start)
        {
            ans.push_back(a[i++]);
        }
        
        //当插入元素与a[i]元素有重叠时,则提取两者start最小值,end最大值保证不重复
        while(i<a.size() && b.end >= a[i].start)
        {
            b.start = min(b.start,a[i].start);
            b.end = max(b.end,a[i].end);
            ++i;
        }
        ans.push_back(b);
        
        //收尾
        while(i<a.size())
        {
            ans.push_back(a[i++]);
        }

        return ans;
        
    }
};





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值