合并区间,Merge Intervals

举报
Linux猿 发表于 2021/10/24 22:02:45 2021/10/24
【摘要】 🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊! 🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬

🎈 作者:Linux猿

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

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


一、题目描述
给定一个包含若干个区间集合的数组 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/


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

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


【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。