力扣 56. 合并区间

一、题目描述

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]。

示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

二、题解

通过贪心法求解,从前向后遍历,每次都取最大右边界,时间复杂度与空间复杂度均为 O ( n ) O(n) O(n)

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>> &intervals) {
        vector<vector<int>> ret;

        /* 将所有区间按照起始位置从小到大进行排序 */
        sort(intervals.begin(), intervals.end(), cmp);


        /* 合并区间 */
        for (int i = 0; i < intervals.size(); i++) {
            int begin = intervals.at(i).at(0);
            int end = intervals.at(i).at(1);

            while (i + 1 < intervals.size() && intervals.at(i + 1).at(0) <= end) { // 下一区间起始小于当前区间末尾
                end = max(end, intervals.at(i + 1).at(1));
                i = i + 1;
            }

            ret.emplace_back(vector<int>{begin, end});
        }

        return ret;
    }

private:
	/**
     * 当sort函数在类内使用且comp函数也是类成员函数时必须要在comp函数前加static
     * 因为sort需要的是普通函数指针而不是成员函数指针
     */
    static bool cmp(const vector<int> &a, const vector<int> &b) {
        return a.at(0) < b.at(0);
    }
};

其中排序函数也可以通过Lambda表达式实现:

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>> &intervals) {
        vector<vector<int>> ret;

        /* 将所有区间按照起始位置从小到大进行排序 */
        sort(intervals.begin(), intervals.end(), [](const vector<int> &a, const vector<int> &b) {
            return a.at(0) < b.at(0);
        });


        /* 合并区间 */
        for (int i = 0; i < intervals.size(); i++) {
            int begin = intervals.at(i).at(0);
            int end = intervals.at(i).at(1);

            while (i + 1 < intervals.size() && intervals.at(i + 1).at(0) <= end) { // 下一区间起始小于当前区间末尾
                end = max(end, intervals.at(i + 1).at(1));
                i = i + 1;
            }

            ret.emplace_back(vector<int>{begin, end});
        }

        return ret;
    }
};

在这里插入图片描述

你可能感兴趣的:(数据结构与算法,leetcode,算法)