Leetcode65
链接:力扣 。
题目:
给出一个区间的集合,请合并所有重叠的区间。
示例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] 可被视为重叠区间。
思路:
区间贪心的一种题目。
与其他的区间贪心类似,首先要对区间按左边界或右边界排序。一般按左边界排序,此题我们要按左边界从小到大排序。
排序之后我们从头遍历区间依次合并即可,对于当前正在合并的区间,我们要尽可能使它最大。这就是一个贪心的过程。
起始时,我们把排序后的第一个区间当作正在合并的区间(left, right),即intervals[0]。我们的遍历从intervals[1]开始,对于当前遍历的区间,如果它与正在合并的区间重叠,我们就将其与(left, right)合并,如果不重叠,则表示正在合并的区间已经尽可能大了,我们将其记录入结果,然后令(left, right)为当前区间继续循环。
参考代码:
class Solution {
public:
static bool cmp(const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int> > result;
sort(intervals.begin(), intervals.end(), cmp);
int left = intervals[0][0], right = intervals[0][1];
for (int i = 1; i < intervals.size(); i++) {
if (intervals[i][0] >= left && intervals[i][0] <= right) {
right = max(right, intervals[i][1]);
}
else {
result.push_back({left, right});
left = intervals[i][0];
right = intervals[i][1];
}
}
result.push_back({left, right});
return result;
}
};