LeetCode 之 Merge Intervals — C++ 实现

本文深入解析了区间合并问题,提供了一种高效的算法解决方案,并通过实例展示了如何实现区间合并。

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

Merge Intervals

Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

给定一个区间集合,合并所有重复区间。

例如,

给定 [1,3],[2,6],[8,10],[15,18]

返回 [1,6],[8,10],[15,18]

分析:

    先将各区间按照左边界(若左边界相等,按右边界)排序,然后再合并。当一个区间的右边界大于另一个区间的左边界时,不需要合并,否则区间有重合,这时只需要用大的右边界作为该区间的右边界,重复此过程。

注意:不要忘记最后一个合并区间。

class Solution {
public:
    vector<Interval> merge(vector<Interval>& intervals) {
        int intervalsSize = intervals.size();
        if(intervalsSize == 0 || intervalsSize == 1)
        {
            return intervals;
        }
        
        //对 interval 按 start 的升序排序
        sort(intervals.begin(), intervals.end(), intervalComp);
        
        vector<Interval> retv;
        Interval inter(intervals[0].start, intervals[0].end);
        
        for(int index = 1; index < intervalsSize;)
        {
            if(inter.end < intervals[index].start) //无区间重合,直接把前一个区间放入已合并和的 vector 中
            {
                retv.push_back(inter);
                inter.start = intervals[index].start;
                inter.end = intervals[index].end;
            }
            else if(inter.end < intervals[index].end) //区间有重合,直接用大边界代替
            {
                inter.end = intervals[index].end;
            }
            
            if(index + 1 == intervalsSize) //原数组中无区间待合并,将临时区间加入合并好区间
            {
                retv.push_back(inter);
            }
            ++index;
        }
        
        return retv;
    }
    
    static bool intervalComp(Interval& val1, Interval& val2)
    {
        if(val1.start == val2.start) //start相等,则按 end 升序排列
        {
            return (val1.end < val2.end);
        }
        
        return (val1.start < val2.start);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值