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)
思路二:
越努力,越幸运