1. 题目来源
链接:lc56. 合并区间
2. 题目解析
区间问题模板题,隶属于区间合并问题,是一道非常经典的贪心问题,思路如下:
- 按区间左端点从小到大排序
- 依次处理下一个区间
- 如果有交集,则更新右端点。与当前维护的
r
取max
,防止出现左端大,右端小的情况,导致错误更新! - 没交集,则将当前区间加入答案。下一个区间作为新的维护区间,更新左端点和右端点。
- 如果有交集,则更新右端点。与当前维护的
- 最后注意需要将最后维护的一个区间加入答案即可。 因为每次我们将合并好的区间加入到答案中时,都是找到下一个新区间,它的左端点大于当前维护的右端点,才将当前维护的区间加入到答案中,然后更新
l
,r
。即每次有剩余区间合法时,才将当前维护的区间加入到答案中,所以当只有一个区间时,或者最后没有剩余区间时,需要再最后额外处理最后的区间{l, r}
。
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
代码:
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> ans;
sort(intervals.begin(), intervals.end());
int l = intervals[0][0], r = intervals[0][1];
for (int i = 0; i < intervals.size(); i ++ ) {
if (intervals[i][0] > r) ans.push_back({l, r}), l = intervals[i][0], r = intervals[i][1];
else r = max(r, intervals[i][1]);
}
ans.push_back({l, r});
return ans;
}
};