leetcode 56. Merge Intervals

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.

题目大意:合并区间,[1,3]和[2,6]有交集,合并[1,6]。

思路一:先将数组排序,优先根据区间的第一个数排序,小的排在前面,如果区间第一个数相同,根据区间第二个数从小到大排序。

假设下标 i 指向排好序的第i个区间,从第 i + 1个区间[c, d]开始合并与第i个区间[a, b]有交集的区间。由于排好序,如果第i + 1个区间与第i个数没有交集,后面的区间必然没有交集。

假如第i + 1个区间[c, d]的第一个数c在第i个区间[a, b]内,则合并。如果d >= b, 说明合并后的区间要更新,否则(d < b)说明[c, d]在[a, b]内部。

 1 class Solution {
 2     static bool cmp(vector<int> a, vector<int> b) {
 3         if (a[0] != b[0])
 4             return a[0] < b[0];
 5         else 
 6             return a[1] < b[1];
 7     }
 8 public:
 9     vector<vector<int>> merge(vector<vector<int>>& intervals) {
10         vector<vector<int> > res;
11         sort(intervals.begin(), intervals.end(), cmp);
12         for (int i = 0; i < intervals.size();) {
13             vector<int> tmp(2, 0); //用于保存每一轮合并的区间
14             tmp[0] = intervals[i][0], tmp[1] = intervals[i][1]; //一开始初始化合并区间为当前的区间
15             while (++i < intervals.size() && (intervals[i][0] <= tmp[1])) { //从当前区间后一个区间开始判断
16                 if (intervals[i][1] >= tmp[1])
17                     tmp[1] = intervals[i][1];
18             }
19             res.push_back(tmp);
20         }
21         return res;
22     }
23 };

时间复杂度: O(NlogN), 空间复杂度 O(1)

思路二:

原文地址:https://www.cnblogs.com/qinduanyinghua/p/11637443.html