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 merge(vector& intervals) {
        if(intervals.empty()) return {};
        vector ans;
        sort(intervals.begin(), intervals.end(), Less);
        int i=1;
        int tmp1=intervals[0].start, tmp2=intervals[0].end;
        while(i=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)的复杂度拖慢了速度。但是想了半天没想到改进的方法,重新提交后发现之前是系统抽风了=_=

你可能感兴趣的:(56. Merge Intervals)