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

写在最后

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

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

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

相关推荐
T.Ree.2 天前
【数据结构】_排序
数据结构·算法·排序算法·排序
laufing6 天前
OD 算法题 B卷【比赛】
数据结构·排序·逻辑分析
Tipriest_13 天前
【C++20新特性】ranges::sort()使用方法,优势,注意点
算法·leetcode·c++20·排序·sort
Tee xm16 天前
算法修仙传 第一章 灵根觉醒:数组基础与遍历
java·数据结构·算法·数组·遍历
阳洞洞17 天前
leetcode 148. Sort List
leetcode·链表·归并排序·递归·排序
winfredzhang18 天前
打造高效数据处理利器:用Python实现Excel文件智能合并工具
python·excel·合并·排序·xlsx
GUIQU.20 天前
【每日一题丨2025年5.12~5.18】排序相关题
算法·排序·每日一题
小学生的信奥之路21 天前
力扣1991:找到数组的中间位置(前缀和)
数据结构·算法·leetcode·前缀和·数组
Espresso Macchiato21 天前
Leetcode 3551. Minimum Swaps to Sort by Digit Sum
leetcode·排序·leetcode medium·leetcode 3551·leetcode周赛450
吗喽对你问好1 个月前
华为5.7机考第一题充电桩问题Java代码实现
java·华为·排序