Merge Intervals

1,题目要求

Given a collection of intervals, merge all overlapping intervals.

Example 1:
Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3]and[2,6]overlaps, merge them into [1,6].

Example 2:
Input: [[1,4],[4,5]]
Output:[[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.

NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.

给定间隔的集合,合并所有重叠的间隔。

2,题目思路

对于这道题,题目要求是对于一系列的时间间隔,将它们进行合并。

从题目给出的例子我们可以看出,这个问题实际上就是一个区间的并集问题。如果给定的时间间隔是有序的,那么在合并上是非常方便快捷的。

但是,给定的序列未必是有序的。因此,我们需要对这个序列进行排序,也就是需要重写一下cmp函数。

  • cmp必须设置为全局函数或者静态函数

按照从小到大的顺序排序之后,我们只需要对res最后一个元素的结束时间与新加入元素的开始时间进行比较即可:

  • 如果最后元素的结束时间比新加入元素的开始时间要小,那么这两个时间间隔并没有交集,将这个新的时间间隔加入res。
  • 如果最后元素的结束时间大于等于新加入元素的开始时间,那么我们就比较二者的结束时间,选择结束时间大的作为新的结束时间,将二者合并。

3,代码实现

int x = []() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    return 0;
}();

class Solution {
public:
    static bool cmp(const vector<int> &x, const vector<int> &y){
        return x[0] < y[0]|| (x[0]== y[0] && x[1]< y[1]);
    }  
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> res = {}; 
        if(intervals.size() == 0)
            return res;
        
        sort(intervals.begin(), intervals.end(), cmp);
        
        res.push_back(intervals[0]);
        for(int i = 1;i<intervals.size();i++){
            if(res.back()[1] < intervals[i][0])
                res.push_back(intervals[i]);
            else
                res.back()[1] = max(res.back()[1], intervals[i][1]);
        }
        return res;
    }
};

你可能感兴趣的:(LeetCode,Top100,Liked,Question,C++OJ,LeetCode,Self-Culture,LeetCode,TopInterview,Question,Top,100,Liked,Questions,Top,Interview,Questions)