LeetCode解法汇总56. 合并区间

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台


描述:

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

示例 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] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

解题思路:

* 解题思路:

* 首先按照intervals[i].left的大小排序,然后选出第一个为header,header和后面的一一比较,分为三种情况:

* 1.header.right<interval.left;此时说明两个区间不相交,则把header加入out中,并且更新interval为header;

* 2.header.right>=interval.right;此时说明header完全覆盖interval,则可以直接跳过;

* 3.header.right<interval.right;此时说明两个区间有相交则相互不能完全覆盖,则更新header的right,等于区间合并。

代码:

class Solution56
{
public:
    vector<vector<int>> merge(vector<vector<int>> intervals)
    {
        sort(intervals.begin(), intervals.end(), [](vector<int> v1, vector<int> v2)
             { return v1[0] - v2[0] < 0; });
        vector<vector<int>> out;
        vector<int> header;
        for (vector<int> interval : intervals)
        {
            if (header.size() == 0)
            {
                header = interval;
                continue;
            }
            if ((header)[1] < interval[0])
            {
                out.push_back(header);
                header = interval;
                continue;
            }
            if ((header)[1] >= interval[1])
            {
                continue;
            }
            header[1] = interval[1];
        }
        out.push_back(header);
        return out;
    }
};

猜你喜欢

转载自blog.csdn.net/AA5279AA/article/details/132597327
今日推荐