leetcode 56. Merge Intervals

这里写图片描述

 这是一道知道技巧就能比较容易解决的题。题目要求对于给出的各个区间,如果有区间出现重叠,那就将它们合并。题意很容易理解,但是乍一看会觉得难以用编程来实现。直接能想到的方法比如不停地遍历整个区间的集合,如果发现有交叠就合并,直到没有交叠。这种方法比较费时,实现起来也不容易。其实虽然现在做的算法题不多,但是先排个序就能让问题变简单的题目不少。这题也是如此。
 对于这道算法题,可以先按每个区间的下界从小到大排个序,然后遍历整个集合,如果发现下一集合和这个集合有交集就合并(对于合并操作,只需要设置两个变量记录区间的下界和上界即可,存入结果集合时才根据它们进行区间的实例化),如果没有交集就说明已经得到一个最终的合并的区间,于是可以将上一次合并的区间保存。遍历结束之后,再将得到的最后一个区间保存。这样就大功告成了。
/**
 * 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:
    bool static cmp(const Interval& a, const Interval& b) {
        return a.start < b.start;
    }
    vector<Interval> merge(vector<Interval>& intervals) {
        vector<Interval> result;
        // 当集合大小小于等于1,不可能会有交集
        if (intervals.size() <= 1) {
            result = intervals;
            return result;
        }
        // 根据自定义的比较函数对集合中区间结构体进行排序
        sort(intervals.begin(), intervals.end(), cmp);
        int lastEnd = intervals[0].end;  //  用于记录当前操作的区间的下界
        int lastStart = intervals[0].start;  //  用于记录区间的下界
        for (int i = 1; i < intervals.size(); i++) {
            //  有交集,则进行合并操作
            if (intervals[i].start <= lastEnd) {
                if (intervals[i].end > lastEnd) {
                    lastEnd = intervals[i].end;
                }
            } else {
                //  没有交集,根据之前记录的上界下界实例化区间并保存
                result.push_back(Interval(lastStart, lastEnd));
                lastEnd = intervals[i].end;
                lastStart = intervals[i].start;
            }
        }
        //  将最后一个没保存的区间保存
        result.push_back(Interval(lastStart, lastEnd));

        return result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值