难度:中等
给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
题目解析:
大概思路就是当前区间的左值和上一个区间的右值比较,如果上一个区间的右值大,那么进一步比较当前区间的右值,哪个大就改成上一个区间的右值。如果当前区间的左值大,那么就把区间存入
参考代码:
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <deque>
#include <stack>
#include <algorithm>
#include <map>
using namespace std;
//代码很漂亮
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if (intervals.size() == 0) {
return{};
}
sort(intervals.begin(), intervals.end());
vector<vector<int>> merged;
for (int i = 0; i < intervals.size(); ++i) {
//使用双指针先指一下一个区间的左右数
int L = intervals[i][0], R = intervals[i][1];
//进行判断merged的上一个区间右侧是否小于左侧
//小的话直接压入当前区间
if (!merged.size() || merged.back()[1] < L) {
merged.push_back({ L, R });
}
else {//大的话修改上一个区间右侧的值(看当前右侧和上一个区间右侧哪个大)
merged.back()[1] = max(merged.back()[1], R);
}
}
return merged;
}
};
int main(void)
{
Solution my_class;
vector<vector<int>> intervals = {
{ 1, 4 }, { 0, 2 }, { 3, 5 }
};
vector<vector<int>> res;
res = my_class.merge(intervals);
if (!res.empty())
for (int i = 0; i < res.size(); i++)
{
for (int j = 0; j < 2; j++)
{
cout << res[i][j] << " ";
}
cout << endl;
}
system("pause");
return 0;
}