LeetCode 056 Merge Intervals

该博客介绍了LeetCode第056题,即如何合并由整数表示的闭区间。首先,对区间进行排序,根据左端点升序,若左端点相同则按右端点降序。接着,遍历区间,利用当前区间与扫描到的区间进行比较,若扫描到的区间与当前区间有交集,则合并区间;否则,保存当前区间并更新。代码实现详述了这一过程。
摘要由CSDN通过智能技术生成

题目给出很多由整数表示的区间,将区间合并后返回。

首先要问区间是用整数还是什么数表示的,然后问是开区间还是闭区间,比如[3,4)和[4,5)不能合并,但是[3,4]和[4,5]就可以合并为[3,5]。在这题中是整数表示的闭区间。

先将区间排序。按照左端点从小到大排序,左端点一样的按照右端点从大到小排序(从小到大也行)。

然后扫描排序好的区间,维护一个当前区间。如果当前区间的右端点比扫描到的左端点还小,那么当前区间就不可能再跟后面区间有相交了(因为已经排过序了),保存并更新当前区间。如果当前区间和扫描到的区间有相交,就合并和更新当前区间。

代码:

    static bool compare(Interval a, Interval b) {
        return (a.start < b.start || (a.start == b.start && a.end < b.end));
    }

    vector<Interval> merge(vector<Interval>& intervals) {
        vector<Interval> result;

        if(intervals.size() == 0)
            return result;

        sort(intervals.begin(), intervals.end(), compare);
        Interval cur(intervals[0].start, intervals[0].end);
        for(auto i = intervals.begin() + 1 ; i != intervals.end() ; i++) {
            if(cur.end < i->start) {
                result.push_back(cur);
                cur = *i;
            }
            else {
                cur.end = max(cur.end, i->end);
            }
        }
        result.push_back(cur);
        return result;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值