每日一题

合并区间

Posted by zhaiyunfan on April 16, 2020

题面

56. 合并区间

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

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

示例 2:

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

题解

我的题解(空间最优题解)

class Solution
{
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals)
    {
        if (intervals.size() == 0)
        {
            return{};
        }

        sort(intervals.begin(), intervals.end());

        vector<vector<int>> merged;
        vector<int> pos;

        pos.push_back(0);

        for (int i = 0; i + 1 < intervals.size(); i++)
        {
            if (intervals[i][1] >= intervals[i + 1][0])
            {
                intervals[i + 1][0] = intervals[i][0];
                intervals[i + 1][1] = max(intervals[i][1], intervals[i + 1][1]);
                pos.back() = i + 1;
            }
            else
            {
                pos.push_back(i + 1);
            }
        }
        for (int j = 0; j < pos.size(); j++)
        {
            merged.push_back(intervals[pos[j]]);
        }
        return merged;
    }
};

最速题解

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

        bool bMerge = true;

        while (bMerge) {

            bMerge = false;
            for (auto data : intervals) {

                bool bCheck = false;
                for (auto it = res.begin(); it != res.end(); it++) {

                    if ((data[0] >= (*it)[0] && data[0] <= (*it)[1]) ||
                        (data[1] >= (*it)[0] && data[1] <= (*it)[1])) {
                        (*it)[0] = min(data[0], (*it)[0]);
                        (*it)[1] = max(data[1], (*it)[1]);
                        bMerge = true;
                        bCheck = true;
                        break;
                    }
                    else if ((data[0] <= (*it)[0] && data[1] >= (*it)[1]) ||
                        (data[0] <= (*it)[0] && data[1] >= (*it)[1])) {
                        (*it)[0] = min(data[0], (*it)[0]);
                        (*it)[1] = max(data[1], (*it)[1]);
                        bMerge = true;
                        bCheck = true;
                        break;
                    }
                }
                if (!bCheck) {
                    res.push_back(data);
                    //bMerge = true;
                }
            }
            intervals = res;
            res.clear();

        }
        return intervals;
    }
};