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

写在最后

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

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

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

相关推荐
Tisfy9 小时前
LeetCode 3507.移除最小数对使数组有序 I:纯模拟
算法·leetcode·题解·模拟·数组
星火开发设计20 小时前
C++ 数组:一维数组的定义、遍历与常见操作
java·开发语言·数据结构·c++·学习·数组·知识
2401_841495641 天前
【Python高级编程】单词统计与查找分析工具
数据结构·python·算法·gui·排序·单词统计·查找
2401_841495642 天前
【数据结构】英文单词词频统计与检索系统
数据结构·c++·算法·排序·词频统计·查找·单词检索
Tisfy2 天前
LeetCode 3314.构造最小位运算数组 I:今日先简单题简单做-到II再优化
算法·leetcode·题解·模拟·数组
汉克老师6 天前
GESP2025年9月认证C++三级真题与解析(单选题9-15)
c++·算法·数组·string·字符数组·gesp三级·gesp3级
Tisfy7 天前
LeetCode 2943.最大化网格图中正方形空洞的面积:小小思维
算法·leetcode·题解·数组·思维·排序·连续
闻缺陷则喜何志丹13 天前
【C++动态规划 状压dp】1879. 两个数组最小的异或值之和|2145
c++·算法·动态规划·力扣·数组·最小·动态规范
故事不长丨15 天前
C#数组深度解析:从基础语法到实战应用
开发语言·c#·数组·array