56. 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].

分析

首先的思路是,将这些区间按照其开始的坐标进行排序,然后从前往后扫描,记录当前的起始点和结束点。如果结束点大于等于后一个起始点,则使用结束点的最大值来更新当前结束点。如果结束点小于后一个起始点,则输出当前起始点和结束点,并以下一个区间来重置起始点和结束点。

实现

/**
 * 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:
    vector<Interval> merge(vector<Interval>& intervals) {
        if(intervals.empty()) return {};
        vector<Interval> ans;
        sort(intervals.begin(), intervals.end(), Less);
        int i=1;
        int tmp1=intervals[0].start, tmp2=intervals[0].end;
        while(i<intervals.size()){
            if(tmp2>=intervals[i].start){
                tmp2 = max(tmp2, intervals[i].end);
            }
            else{
                ans.push_back(Interval(tmp1, tmp2));
                tmp1 = intervals[i].start;
                tmp2 = intervals[i].end;
            }
            i++;
        }
        ans.push_back(Interval(tmp1, tmp2));
        return ans;
    }
    static bool Less (const Interval& a, const Interval& b) {
        return a.start < b.start;
    }
};

思考

这里用到了静态函数成员,其独立与对象存在,这样才能在sort函数中作为参数使用。
不过最后的成绩不是很好,主要是sort的O(nlogn)的复杂度拖慢了速度。但是想了半天没想到改进的方法,重新提交后发现之前是系统抽风了=_=

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容