题目:合并区间
难点在于“如何对重叠区间进行合并”,这里选用的判断条件是—如果当前区间左边界小于结果数组尾部区间的右边界,则选取两者中更大的右边界进行合并
首先以左边界为基准对原数组进行了排序,这样就能从左往右更好地判断是否重叠
// [捕获列表](参数列表) -> 返回值类型 { 函数体 }
auto my_func = [ ](int a, int b) { return a + b; };
但实际上,返回值类型通常可以省略,让编译器自己去猜。所以最常用的长这样:
[] (int a, int b) { return a + b; }
至于这里为什么是直接在res中进行修改,这是因为可以避免多次push_back的开销
1vector<vector<int>> merge(vector<vector<int>>& intervals)
2{
3 if(intervals.empty()) return {};
4 std::sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){return a[0] < b[0];});
5
6 vector<vector<int>> res{intervals[0]};
7
8 for(int i = 1; i < intervals.size(); i++)
9 {
10 // 当前元素左边界小于等于上一个区间右边界 --> 发生重合!
11 if(intervals[i][0] <= res.back()[1])
12 // 取更大的有边界合并
13 res.back()[1] = std::max(res.back()[1], intervals[i][1]);
14 else
15 res.push_back(intervals[i]);
16 }
17 return res;
18}
来源:语雀原笔记