【面试经典150 | 区间】合并区间

文章目录

Tag

【排序】【一次遍历】【数组】


题目来源

56. 合并区间


题目解读

题目意思非常明确,合并有重叠的区间。


解题思路

数据量为 1 0 4 10^4 104,基本上需要时间复杂度为 O ( n ) O(n) O(n) 或者 O ( n l o g n ) O(nlogn) O(nlogn)的解题方法。

方法一:一次遍历

对数组 intervals 按照区间的起始值为关键进行升序排序。遍历该数组:

  • 如果答案数组 ret 为空直接将当前区间放入数组 ret
  • 如果当前区间与 ret 数组的最后一个区间没有交集,说明当前区间没法合并,直接加入答案数组;
  • 否则,将当前区间和数组ret最后一个区间进行合并,即取 max(ret.back()[1], intervals[1]) 作为新的 ret.back()[1]

思路清晰,最后返回ret

实现代码

cpp 复制代码
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end(), [&](vector<int>& a, vector<int>& b) {
            return a[0] < b[0];
        });

        vector<vector<int>> ret;
        int n = intervals.size();
        if (n == 1) {
            return intervals;
        }
        for (int i = 0; i < n; ++i) {
            int L = intervals[i][0], R = intervals[i][1];
            if (!ret.size() || ret.back()[1] < L) {
                ret.push_back({L, R});
            }
            else {
                ret.back()[1] = max(ret.back()[1], R);
            }
        }
        return ret;
    }
};

复杂度分析

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn),一次遍历时间复杂度为 O ( n ) O(n) O(n),快速排序的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),因此总的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)。

空间复杂度: O ( l o g n ) O(logn) O(logn),这是排序需要的空间。空间复杂度计算不包括储存答案的数组。

其他语言

python3

python3 复制代码
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals.sort(key = lambda x : x[0])

        res = []
        for interval in intervals:
            if not res or res[-1][1] < interval[0]:
                res.append(interval)
            else:
                res[-1][1] = max(res[-1][1], interval[1])
        return res

写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

相关推荐
杨小码不BUG4 天前
小鱼的数字游戏:C++实现与算法分析(洛谷P1427)
c++·算法·数组·信奥赛·csp-j/s
宁小法4 天前
PHP 数组 如何将新元素加到数组第一个位置(支持指定key => value)
php·数组·首个元素
摸鱼的老谭8 天前
Java学习之旅第一季-25:一维数组
java·开发语言·数组
hope_wisdom11 天前
C/C++数据结构之用数组实现栈
c语言·数据结构·c++·数组·
KarrySmile1 个月前
HOT100--Day23--153. 寻找旋转排序数组中的最小值,4. 寻找两个正序数组的中位数,20. 有效的括号
二分查找·数组··hot100·二分法·二分搜索·旋转排序数组
一叶难遮天1 个月前
Android面试指南(八)
java·设计模式·数组·hashmap·string·android面试·匿名内部类
u6061 个月前
常用排序算法核心知识点梳理
算法·排序
梁辰兴1 个月前
数据结构:排序
数据结构·算法·排序算法·c·插入排序·排序·交换排序
Tisfy1 个月前
LeetCode 3027.人员站位的方案数 II:简单一个排序O(n^2)——ASCII图解
leetcode·题解·思维·排序·hard
ShineWinsu1 个月前
对于牛客网—语言学习篇—编程初学者入门训练—复合类型:BC140 杨辉三角、BC133 回型矩阵、BC134 蛇形矩阵题目的解析
c语言·矩阵·数组·蛇形矩阵·杨辉三角·牛客网·回型矩阵