# 合并区间
# 1.1 题目
# 1.2 解题思路
很难评价这道题目的意义,没有特别多的技巧,单纯的见招拆招,给我一种写了和没写差不多的感觉,没有成就感和收获.
简单说一下思路:
- 题目中说若干区间,但是没有说是有序的,所以我们需要先对区间进行排序.
- 检测相邻的两个区间,前者的左端点大于等于后者的右端点,则代表二者的右侧区间有重合,合并为一个区间 (对应操作则为更新区间的右端点)
- 重复该操作,直到当前区间的与下一个区间的右侧无重合,则将下一个区间加入结果集,并更新下标结果集的索引值 (对应操作为向 res 中压入一个区间).
- 重复 2-3 步骤,直到所有区间都被合并.
# 1.3 代码实现
class Solution { | |
public: | |
vector<vector<int>> merge(vector<vector<int>>& intervals) { | |
int n = intervals.size(); | |
vector<vector<int>> res; | |
sort(intervals.begin(), intervals.end()); | |
int j = 0; | |
res.push_back(intervals[0]); | |
for (int i = j + 1; i < n; i++) { | |
// When the right of the current interval is bigger than the left of the | |
// next interval, merge them | |
if (intervals[i][0] <= res[j][1]) { | |
res[j][1] = max(res[j][1], intervals[i][1]); | |
} else { | |
// On the contrary, add the current interval to the result | |
res.push_back(intervals[i]); | |
j++; | |
} | |
} | |
return res; | |
} | |
}; |
大道五十,天衍四十九,人遁其一!