题目
给出一个区间的集合,请合并所有重叠的区间。
示例1
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例2
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
思路
- 首先每个元素都是一个数组,有两个元素。先按照第一个元素的大小对二维数组排序。
- 然后开始遍历数组,使用left记录区间的左边,right记录区间的右边。当前元素的第一、第二个值用a、b表示。
- 如果a <= right, 则说明[left, right]和[a, b]有交集。则更新right = max (right, b)。
- 如果a > right, 则说明没交集,此时将{left, right}保存到结果中。然后更新left = 1, right = b, 继续遍历数组。
代码
class Solution {
public:
static bool lessThan( const vector<int>& a, const vector<int>& b ) {
return a[0] < b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if ( intervals.size() == 0 ) return {};
if ( intervals.size() == 1 ) return intervals;
vector<vector<int>> res;
// mySort( intervals, 0, intervals.size() - 1 );
sort( intervals.begin(), intervals.end(), lessThan );
int i = 0;
while ( i < intervals.size() ) {
int left = intervals[i][0];
int right = intervals[i][1];
while ( i < intervals.size() - 1 && intervals[i+1][0] <= right ) {
right = max( right, intervals[i+1][1] );
++i;
}
res.push_back( { left, right } );
++i;
}
return res;
}
// void mySort( vector<vector<int>>& nums, int lo, int hi ) {
// if ( lo >= hi ) return;
// int mid = partition( nums, lo, hi );
// mySort( nums, lo, mid - 1 );
// mySort( nums, mid + 1, hi );
// return;
// }
// int partition( vector<vector<int>>& nums, int lo, int hi ) {
// int index = rand() % ( hi - lo + 1) + lo;
// swap( nums[lo], nums[index] );
// vector<int> pivot = nums[lo];
// while ( lo < hi ) {
// while ( lo < hi && pivot[0] <= nums[hi][0] )
// --hi;
// nums[lo] = nums[hi];
// while ( lo < hi && pivot[0] > nums[lo][0] )
// ++lo;
// nums[hi] = nums[lo];
// }
// nums[lo] = pivot;
// return lo;
// }
// void swap( vector<int>& a, vector<int>& b ) {
// vector<int> temp = a;
// a = b;
// b = temp;
// return;
// }
};