LeetCode合并区间C++实现
- LeetCode 56题
- 思路
- 图示
- 完整代码
- 运行结果
- 代码或思路哪里有误还请指正!!thank you!!
LeetCode 56题
以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
思路
1.我们首先可以对数据进行排序。
2.把排序后的数据的第一组区间先放到结果集中,如果后续需要合并,可以直接在结果集中进行合并。
3.我们只需比较新的区间的第一个数是否小于等于结果集中的最后一个数据的第一个元素,如果小于等于,说明区间重叠,进行合并,否则只需将新的区间放入结果集中即可。
图示
完整代码
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
vector<vector<int>> ve; // 存储区间
vector<vector<int>> result; // 存放合并后的结果
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
vector<int> temp;
int l, r;
cin >> l >> r;
temp.push_back(l);
temp.push_back(r);
ve.push_back(temp);
}
sort(ve.begin(), ve.end()); // 先进行排序
result.push_back(ve[0]); // 第一组可以直接放入结果集中,后续若需要合并再直接在result中进行合并。
// 遍历
// 列子:[1,2],[2,4],[5,6][7,8],[7,9]
for (int i = 1; i < ve.size(); i++)
{
if (result.back()[1] >= ve[i][0])
{ // 需要合并
result.back()[1] = max(result.back()[1], ve[i][1]);
}
else
{
// 不需要合并,直接放入
result.push_back(ve[i]);
}
}
// 验证,这一步可省略,这里只是检查是否正确
for (int i = 0; i < result.size(); i++)
{
for (int j = 0; j < result[i].size(); j++)
{
cout << result[i][j] << " ";
}
cout << endl;
}
cout << "合并后区间数:" << result.size() << endl;
system("pause");
return 0;
}