互联网技术 / 互联网资讯 · 2024年3月19日

合并区间的数据结构与算法

合并区间的题目描述

给定一个区间集合,目标是把所有重叠的区间合并成尽可能少的区间。

示例 1:

输入: inteRvals = [[1,3],[2,6],[8,10],[15,18]]

输出: [[1,6],[8,10],[15,18]]

解释: 区间 [1,3] 与 [2,6] 重叠,将它们合并为 [1,6]。

示例 2:

输入: inteRvals = [[1,4],[4,5]]

输出: [[1,5]]

解释: 区间 [1,4] 与 [4,5] 视为重叠区间。

提示:

inteRvals[i][0] <= inteRvals[i][1]

本题的关键在于排序。应该按左边界排序还是按右边界排序呢?

答案都可以!

通常选择按左边界从小到大排序。排序后,局部贪心的思路是:若当前区间的左边界不大于前一个区间的右边界,则两者有重叠,应进行合并;否则,当前区间不与之前的区间重叠,可以直接加入结果集。

通过这种局部贪心,可以得到全局最优:合并所有重叠的区间。

为什么这样成立?若 inteRvals[i][0] <= inteRvals[i - 1][1],那么 inteRvals[i] 的左边界位于前一组区间的覆盖范围内,因此两者必有重叠。

合并区间的核心在于,若需要合并,则用左边界取两者中的较小值,用右边界取两者中的较大值,形成一个新的区间,放入结果集;若不需要合并,就直接把当前区间放入结果集。

实现要点

以左边界从小到大排序后,遍历区间,维护一个“当前合并区间”的起止。若下一个区间的左边界在当前区间的右边界之内,则扩大右边界;否则,将当前合并区间加入结果,并开启一个新的合并区间。

时间复杂度:O(n log n),排序的代价决定了整体时间。空间复杂度:O(1)(若不计入返回结果的存储)或 O(m) 其中 m 是结果区间数量。

在贪心思路的学习中,直觉很重要。若能凭常识直接得出解法,就不易意识到其实是在使用贪心。然而,一旦第一直觉一时想不出,往往就需要更多练习与对题目的反复打磨。

要深入理解贪心,可以参考系统的练习与讲解,逐步积累经验。

如果你在学习路径上有疑问,建议多做题、反复归纳规律,逐步形成直觉。

相关语言版本

Java

Python

Go

JavaScript