1. 题目

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

2. 思路

先排序,排序规则是start小的在前,如果start相等则end大的在前。
然后从前往后遍历,如果当前要处理的节点可以归并到当前已归并的末节点上,则归并上去。
最后将已归并节点之后的空间清掉。

3. 代码

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */

bool cmp(Interval& i, Interval& j) {
    return i.start < j.start || i.start == j.start && i.end > j.end;
}
 
class Solution {
public:
    // 先排序, 起点小终点大在前。
    // 然后从前往后遍历, 将可以归并的点进行归并填入,最后多出来的元素删掉
    vector<Interval> merge(vector<Interval>& intervals) {
        if (intervals.size() == 0) { return intervals; }
        sort(intervals.begin(), intervals.end(), cmp);
        int fill = 0;
        int merge = 1;
        while (merge < intervals.size()) {
            Interval& fi = intervals[fill];
            Interval& mi = intervals[merge];
            if (fi.end >= mi.start) {
                if (mi.end > fi.end) {
                    fi.end = mi.end;
                }
            } else {
                fill++;
                if (fill != merge) {
                    intervals[fill] = intervals[merge];
                }
            }
            merge++;
        }
        intervals.resize(fill+1);
        return intervals;
    }
};

knzeus
72 声望28 粉丝

行万里路,读万卷书