【面试经典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

写在最后

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

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

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

相关推荐
WenGyyyL2 天前
力扣每日一题——数组能够形成多少对
算法·leetcode·职场和发展·集合·数组·哈希表
水蓝烟雨6 天前
[数组基础] 0073. 矩阵置零
算法·leetcode·数组
IronmanJay12 天前
【LeetCode每日一题】——1791.找出星型图的中心节点
数据结构·算法·leetcode··数组··1791.找出星型图的中心节点
一直学习永不止步17 天前
LeetCode题练习与总结:拼接最大数--321
java·leetcode·贪心·数组··双指针·单调栈
Tisfy17 天前
LeetCode 0910.最小差值 II:贪心(排序)-小数大数分界线枚举(思考过程详解)
算法·leetcode·题解·贪心·枚举·思维·排序
CHENWENFEIc20 天前
数据结构之顺序表详解:从原理到C语言实现
c语言·数据结构·学习·算法·程序员创富·数组·改行学it
DogDaoDao1 个月前
LeetCode 算法:多数元素 c++
数据结构·c++·算法·leetcode·排序
一直学习永不止步1 个月前
LeetCode题练习与总结:生命游戏--289
java·数据结构·算法·leetcode·矩阵·模拟·数组
小码狐1 个月前
力扣【2187-完成旅途的最少时间】【数组-C语言实现】
c语言·算法·leetcode·二分查找·数组
一直学习永不止步1 个月前
LeetCode题练习与总结:H 指数--274
java·数据结构·算法·leetcode·数组·排序·计数排序