本文始发于个人公众号:TechFlow,原创不易,求个关注
今天是LeetCode专题的第33篇文章,我们一起来看LeetCode的第56题,它的难度是Medium。
题意
这道题的题意也很简单,只有一句话:“Given a collection of intervals, merge all overlapping intervals.”
interval是间隔、区间的意思,也就是说题目会给我们一系列区间,让我们把这些区间合并在一起。
我们看下题目给的样例来感受一下:
Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.
分析
通过观察样例,我们发现题目通过数组给定区间,每个区间有两个端点。两个区间能够合并的条件,就是互相之间有交叉的部分。我们看下下图,这应该很直观。
当两个区间[s1, e1]和[s2, e2]中的e1 >= s2时,这两个区间就可以进行合并。合并之后得到的新区间是[s1, e2]。
但是这存在一个小问题,我们如何能判断第一个区间一定在第二个区间的左侧呢,会不会发生重叠呢?
如果是这种情况那么合并之后的结果就是[s2, e2]了,另外一个问题是,这样的区间一共有N个,我们怎么判断合并的顺序呢?很有可能出现AB两个区间原本不能合并,但是A合并了区间C之后又可以和B合并的情况。如果我们枚举的话会很麻烦,我们不但需要考虑合并的时候会发生的种种情况,还需要考虑合并的发生顺序。而且我们也很难得知是否所有能够合并的区间已经合并完成。
题解
我们梳理一下目前遇到的问题,第一个问题是区间根据位置的不同合并之后的结果可能有多个。第二个问题是区间合并之后会创建新的合并的可能,第三个问题是我们判断当前是否还有合并的可能开销很大。
其中第三个问题是前两个问题导致的&#x