题目:
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
class Solution {
// // 法一::按照自己想法写的,主要就是更新 左右边界
// private:
// // 按照左边界排序
// static bool cmp(const vector<int>& a, const vector<int>& b)
// {
// return a[0] < b[0];
// }
// public:
// vector<vector<int>> merge(vector<vector<int>>& intervals)
// {
// vector<vector<int>> result;
// if(intervals.size() == 0) return result;
// sort(intervals.begin(), intervals.end(), cmp);
// int start = intervals[0][0];
// int end = intervals[0][1];
// for(int i = 1; i < intervals.size(); i++)
// {
// // 这样写 会把最后一个元素没有合并,有很多边界问题没有考虑到位
// if(intervals[i][0] <= end)
// {
// start = min(start, intervals[i][0]);
// end = max(end, intervals[i][1]);
// }
// else
// {
// // 这里不要忘记加 {} ,第一次用这样的方式给 vector 尾插呢
// result.push_back({start, end});
// start = intervals[i][0];
// end = intervals[i][1];
// }
// }
// // 如上遍历后,最后一个区间只做了更新,没有放入 result,所以在for循环外进行尾插
// // 这样就解决了刚刚的 最后一个元素没有合并的问题
// result.push_back({start, end});
// return result;
// }
// 法二::学习一个vector.back() 的用法,解题与上一个类似
// 1、vactor.back()
// 2、lamada 表达式,排序的时候使用的
public:
vector<vector<int>> merge(vector<vector<int>>& intervals)
{
vector<vector<int>> result;
if(intervals.size() == 0) return result;
// 这里使用了 lamada表达式
sort(intervals.begin(), intervals.end(), [](const vector<int>& a,
const vector<int>& b){return a[0] < b[0];});
result.push_back(intervals[0]);
for(int i = 1; i < intervals.size(); i++)
{
if(result.back()[1] >= intervals[i][0])
{
result.back()[1] = max(result.back()[1], intervals[i][1]);
}
else
{
// 注意 尾插的时候,并不是最终的结果,此时只有左边界已经确定,无需改动
// 但是对于右边界,还需要在后续过程中不断地 更新
result.push_back(intervals[i]);
}
}
return result;
}
};