LeetCode中国,https://leetcode-cn.com/problems/merge-intervals/。
给出一个区间的集合,请合并所有重叠的区间。
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
LeetCode 给出本题难度中等。
将给出的区间进行合并,就是讲有重叠的区间进行合并。比如我们给出区间 [1, 3], [1,4],很明显这两个区间是重叠的,所以可以合并称为一个新区间 [1,4]。
1、第一个区间为 [1,3],第二个区间为 [2,6]。很明显这两个区间是重叠的,重叠部分为 [2,3],这样我们可以将这两个区间合并为 [1,6]。这样样例数据变为 [[1,6],[8,10],[15,18]]。
2、第一个区间为 [1,6],第二个区间为 [8,10]。很明显这两个区间是不重叠的。这样样例数据不变。
3、第二个区间为 [8,10],第三个区间为 [15,18]。很明显这两个区间是不重叠的。这样样例数据不变。
4、这样我们遍历完所有区间,最终的输出结果为 [[1,6],[8,10],[15,18]]。
1、第一个区间为 [1,4],第二个区间为 [4,5]。很明显这两个区间是重叠的,重叠部分为 [2,3],这样我们可以将这两个区间合并为 [1,5]。这样样例数据变为 [[1,5]]。
2、这样我们遍历完所有区间,最终的输出结果为 [[1,5]]。
1、由于题目没有明确说明区间是排序的,第一步我们先将区间进行排序,按照开始位置从小到大排序。
2、使用双指针法,对区间进行遍历。比较两个区间,是否要合并。如果需要合并,合并区间继续比较。如果不需要合并,更新指针位置,继续比较。
我们可以直接使用 STL 的排序函数进行排序即可。
只需要比较当前区域的结束位置和下一个区域的开始位置关系即可。
结束位置要取当前区间结束位置和下一个区间结束位置的最大值。因为根据数学关系,我们知道两个区间存在三种关系:不相交、相交、属于。如下图所示。
class Solution {
public:
vector> ans;
vector> merge(vector>& intervals) {
int size = intervals.size();
if (0==size) {
return ans;
}
//先把区间集合按照左端点从小到大进行排序
sort(intervals.begin(), intervals.end(), less>());
//遍历合并
vector curr = intervals[0]; //当前区间
vector next; //下一个区间
for (int i=1; i=intervals[i][0]) {
//区间重叠
curr[1] = max(curr[1], intervals[i][1]);
} else {
ans.push_back(curr);
curr = intervals[i];
}
}
ans.push_back(curr);
return ans;
}
};