题目:合并区间

思路:

难点在于“如何对重叠区间进行合并”,这里选用的判断条件是—如果当前区间左边界小于结果数组尾部区间的右边界,则选取两者中更大的右边界进行合并

具体实现:

首先以左边界为基准对原数组进行了排序,这样就能从左往右更好地判断是否重叠

这里使用到了lambda表达式,它的语法是:

// [捕获列表](参数列表) -> 返回值类型 { 函数体 }

auto my_func = [ ](int a, int b) { return a + b; };

但实际上,返回值类型通常可以省略,让编译器自己去猜。所以最常用的长这样:

[] (int a, int b) { return a + b; }

至于这里为什么是直接在res中进行修改,这是因为可以避免多次push_back的开销

merge()

 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}

来源:语雀原笔记