如果有N个区间[l1, r1], [l2, r2], … ,[lN, rN],只要满足下面的条件我们就说这些区间是有序的:存在 xi∈ [li, ri],其中i = 1, 2, … N。
比如,[1, 4]、[2, 3]和[1.5, 2.5]是有序的,因为我们可以从这三个区间中选择1.1、2.1和2.2三个数。同时[2, 3]、[1, 4]和[1.5, 2.5]也是有序的,因为我们可以选择2.1、2.2和2.4。但是,[1, 2]、[2.7, 3.5]和[1.5, 2.5]不是有序的 。
对于任意一组区间,如何将它们进行排序?
一、破题
题目的要求是对区间进行排序,那么此题的关键就是将题目所给的定义转换为对区间端点的讨论。
二、解题
首先,从仅含有两个区间开始讨论,如果区间 N1 和 N2 可以互换的话,那么有以下两种情况,
N1 的左端点 < N2 的右端点,或者
N1 的右端点 > N2 的左端点
其次是包含三个区间的情况,这里我们不妨先对每个区间的右端点(左端点同理)进行排序,这样的话可以先得到以一组有序区间:
对于区间 N1(a, b), N2(c, d), N3(e, f), 有 b < d < f
这里,我们将三个区间划分成两组进行讨论,
- 一组是 N3 ,作为头区间(最大的区间)
- 一组是 N1 和 N2
可以得出以下各种情况:
至此,我们已经讨论了三个区间的不同排列情况,对于 n 个区间而言,有如下步骤可以递归处理:
- 按照右端点排序;
- 将右端点最大的区间作为头区间,讨论剩余 n -1 个区间的情况;
- 对剩余的 n - 1 个区间按照步骤二重复,直至仅剩 4 个区间为止(也就是右端点最小的四个区间);
- 如果第 4 个区间不能和第 3 个区间交换,则按照上图可以得到前三个区间的情况,并递归地讨论第 4 个区间与第 5 个区间是否能交换,直至递归到最后一个区间,算法终止;
- 如果能交换,则将第 3 个区间作为最大的区间,并可以得到 N1、N2、N4(按照右端点的相对大小排序)这三个区间的情况,并归位;
- 讨论第 4 个区间能否与第 2 个区间交换,不能的话则返回步骤 4;
- 能的话则返回步骤 5,直至讨论到第 4 个区间与第 1 个区间是否能交换,并返回步骤4。