返回

玩转 LeetCode 56. 合并区间,向算法高手进阶!

前端

导言

欢迎来到 LeetCode 56. 合并区间 的世界!在这个算法竞赛的舞台上,我们将携手探索如何将重叠的区间进行合并,从而形成一个新的不重叠区间集合。准备好了吗?让我们一起潜入算法的海洋,开启这场激动人心的冒险之旅!

问题

给你一个区间的集合,请你合并所有重叠的区间。

示例

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3][2,6] 重叠,合并后为 [1,6]。
区间 [8,10][15,18] 不重叠。

思路与算法

为了解决这个问题,我们可以采用贪心算法。具体步骤如下:

  1. 首先,我们将区间按照起始位置进行排序。
  2. 然后,我们从第一个区间开始遍历。
  3. 如果当前区间与下一个区间重叠,则将它们合并。
  4. 如果当前区间与下一个区间不重叠,则将当前区间加入到结果集中。

代码实现

def merge(intervals):
    """
    :type intervals: List[List[int]]
    :rtype: List[List[int]]
    """
    # 按照起始位置对区间进行排序
    intervals.sort(key=lambda x: x[0])

    # 合并重叠区间
    result = []
    for interval in intervals:
        # 如果当前区间与上一个区间重叠,则将它们合并
        if result and interval[0] <= result[-1][1]:
            result[-1][1] = max(result[-1][1], interval[1])
        # 否则,将当前区间加入到结果集中
        else:
            result.append(interval)

    # 返回结果
    return result

复杂度分析

  • 时间复杂度:O(n log n),其中 n 是区间集合的大小。因为我们需要对区间进行排序,排序的复杂度为 O(n log n)。合并区间的时间复杂度为 O(n)。
  • 空间复杂度:O(n),因为我们需要存储结果集。

结语

至此,我们已经成功地掌握了如何将重叠的区间进行合并,并将其转化为一个新的不重叠区间集合。希望通过这篇文章,你对 LeetCode 56. 合并区间 的算法有了更深入的理解。未来,你将面临更多复杂的算法挑战,但我们坚信,通过不断地练习和探索,你一定能够成为一名算法高手!