返回

力争成为海贼王!用纯洁的C++向剑指LeetCode进军(56)—— 合并区间问题

前端

大家好!我是路飞,今天我们一起来解决LeetCode的第56关:合并区间。让我们一起扬帆起航,探索LeetCode的广阔世界吧!

问题

给你一个由不相交区间组成的列表intervals,其中intervals[i] = [starti, endi]表示开始于starti并结束于endi的区间。合并所有重叠的区间,并返回一个不重叠的区间列表,该列表应按起始位置排序。

输入:

intervals = [[1,3],[2,6],[8,10],[15,18]]

输出:

[[1,6],[8,10],[15,18]]

示例 2:

intervals = [[1,4],[4,5]]

输出:

[[1,5]]

示例 3:

intervals = [[1,4],[0,4]]

输出:

[[0,4]]

思路解析

解决这个问题,我们可以使用贪心算法。首先,我们将所有区间按照起始位置排序。然后,我们从第一个区间开始,将其与后续的区间进行比较。如果当前区间与后续区间重叠,那么我们就将两个区间合并。如果两个区间不重叠,那么我们就将当前区间添加到最终结果中,并继续比较下一个区间。

C++实现

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

        // 先按照起始位置排序
        sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b) {
            return a[0] < b[0];
        });

        vector<vector<int>> result;
        result.push_back(intervals[0]);

        for (int i = 1; i < intervals.size(); i++) {
            if (result.back()[1] >= intervals[i][0]) {
                // 重叠,更新结果中的最后一个区间
                result.back()[1] = max(result.back()[1], intervals[i][1]);
            } else {
                // 不重叠,将当前区间添加到结果中
                result.push_back(intervals[i]);
            }
        }

        return result;
    }
};

复杂度分析

  • 时间复杂度:O(nlogn),其中n为区间数量。排序的时间复杂度为O(nlogn),而合并区间的过程的时间复杂度为O(n)。
  • 空间复杂度:O(n),因为我们使用了一个结果向量来存储合并后的区间。

结语

以上就是合并区间问题的解决方法。希望这篇文章对大家有所帮助。

想要了解更多精彩内容,请持续关注我们!