leetcode 56. Merge Intervals

来源:互联网 发布:淘宝二手官网 编辑:程序博客网 时间:2024/06/03 20:47

这里写图片描述

 这是一道知道技巧就能比较容易解决的题。题目要求对于给出的各个区间,如果有区间出现重叠,那就将它们合并。题意很容易理解,但是乍一看会觉得难以用编程来实现。直接能想到的方法比如不停地遍历整个区间的集合,如果发现有交叠就合并,直到没有交叠。这种方法比较费时,实现起来也不容易。其实虽然现在做的算法题不多,但是先排个序就能让问题变简单的题目不少。这题也是如此。

 对于这道算法题,可以先按每个区间的下界从小到大排个序,然后遍历整个集合,如果发现下一集合和这个集合有交集就合并(对于合并操作,只需要设置两个变量记录区间的下界和上界即可,存入结果集合时才根据它们进行区间的实例化),如果没有交集就说明已经得到一个最终的合并的区间,于是可以将上一次合并的区间保存。遍历结束之后,再将得到的最后一个区间保存。这样就大功告成了。

/** * 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;    }};
原创粉丝点击