【力扣题解】【56. 合并区间】可以合并,但不要立即存入结果

56. 合并区间

总结和复盘

  1. 主要是了解,合并得到新区间之后,不要立即存入结果集,
    因为后续区间可能也可以合并进来。当无法合并时,才将之前的结果存入结果集。

  2. 另外,除了常见的区间包含,还要考虑到一些不容易想到的区间包含情况。

    • [1, 3] 和 [2, 4]
    • [1, 4] 和 [2, 3]
    • [1, 5] 和 [1, 4]
    • [1, 5] 和 [0, 5]
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        // 边界校验
        if (intervals.empty() || intervals.size() == 1)
            return intervals;
        // 先排序,排序之后,循环一遍就可以合并啦
        // 排序的时候,根据每个区间的开始点start来排序
        std::sort(intervals.begin(), intervals.end(), 
            [](vector<int>& a, vector<int>& b) {
                return a[0] < b[0];
            }
        );
        vector<vector<int>> answer;
        int current = 1;
        // L 和 R 是一个动态的区间,初始化时是 intervals 第一个元素
        // 如果两个区间可以合并,则 [L, R] 就代表合并后的区间
        int L = intervals[0][0], R = intervals[0][1];
        while (current < intervals.size()) {
            if (intervals[current][0] <= R) {
                // 可以合并,但不立即存入结果,因为后续区间,有可能也是可以合并的
                // 所以这里就只是计算合并之后的 L 和 R 是多少,然后继续去尝试合并
                L = (intervals[current][0] < L) ? intervals[current][0] : L;
                R = (intervals[current][1] > R) ? intervals[current][1] : R;
            } else {
                // 不能合并的时候,才将之前合并过的区间,存入结果之中
                answer.emplace_back(vector<int>{L, R});
                // 更新 L 和 R 
                L = intervals[current][0];
                R = intervals[current][1];
            }
            current++;
        }
        // 最后的一个区间,要存入结果之中
        answer.emplace_back(vector<int>{L, R});
        return answer;
    }
};

你可能感兴趣的:(leetcode,算法)