❤️LeetCode 合并区间,Merge Intervals❤️

Posted Linux猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❤️LeetCode 合并区间,Merge Intervals❤️相关的知识,希望对你有一定的参考价值。


🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏:LeetCode面试必备100题 (优质好文持续更新中……)🚀


目录

一、题目描述

二、测试样例

三、算法思路

四、代码实现

五、复杂度分析

六、题目链接


一、题目描述

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

其中:

1 <= intervals.length <= 10^4

intervals[i].length == 2

0 <= starti <= endi <= 10^4

二、测试样例

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

输出:[[1,6],[8,10],[15,18]]

说明:区间 [1,3] 和 [2,6] 重叠, 所以将它们合并为 [1,6],合并后的区间没有重叠。

三、算法思路

本题是一道经典的贪心题目,首先,对区间按照每个区间的左值从小到大排序,排序后,相近的区间都在一块,然后,遍历一遍所有区间,有重叠和区间进行合并即可。

四、代码实现

class Solution {
public:
    vector<vector<int> > merge(vector<vector<int> >& intervals) {
        if(intervals.size() == 0) return {}; // 为空的情况
        sort(intervals.begin(), intervals.end()); // 以区间第一个元素为基准进行排序
        vector<vector<int> > ans;
        vector<int> tmp(intervals[0]);
        for(int i = 0; i < intervals.size(); ++i) { // 依次遍历
            auto value = intervals[i];
            if(tmp[1] < value[0]) {
                ans.push_back(tmp);
                tmp = value;
            } else if(tmp[1] <= value[1]){
                tmp[1] = value[1];
            }
        }
        ans.push_back(tmp);  // 别忘记最后一个区间
        return ans;
    }
};

五、复杂度分析

时间复杂度:O(nlogn),排序的时间为 O(nlogn),for 循环一遍的时间为 O(n),故总的时间复杂度为O(nlogn);

空间复杂度:O(n),使用到一个临时的 vector 数组,故空间复杂度O(n);

六、题目链接

https://leetcode-cn.com/problems/merge-intervals/


🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


    欢迎关注下方👇👇👇公众号👇👇👇,获取更多优质内容🤞(比心)!

以上是关于❤️LeetCode 合并区间,Merge Intervals❤️的主要内容,如果未能解决你的问题,请参考以下文章

leetcode56. 合并区间

[Leetcode] merge intervals 合并区间

LeetCode 56. Merge Intervals (合并区间)

[LeetCode] 56 - Merge Intervals 合并区间

LeetCode-面试算法经典-Java实现056-Merge Intervals(区间合并)

(Java) LeetCode 56. Merge Intervalse —— 合并区间