给出一组带有开始时间和结束时间的间隔,
[1, 3], [3, 7], [6, 10], [12, 14], [12, 15]
减少它们,以便仅保留不重叠的部分:
[1, 2], [3, 6], [7, 10], [], [14, 15]
请注意,由于[12,15]完全重叠,因此[12,14]变为空。所有间隔都以任何其他间隔缩减为它们的全局不重叠部分。
保证输入中不包含完全潜入另一个而不共享开始或结束的间隔,例如不能使用[1,5],[3,4],因为[3,4]已完全包含在[1,5]中,并且1!= 3和5!=4。
[12,14],[12,15]是有效的输入,尽管[12,14]可以完全包含在[12,15]中,但是它们共享开始时间(12)。
问题:找到一种算法来实现这一目标。
// class with method signature (java)
class Solution {
public int[][] reduce(int[][] intervals) {
...
}
}
有一个O(n ^ 2)解决方案,即对于每个间隔,通过重复遍历数组来每隔一个间隔减小一次,但是我正在寻找更有效的算法思路。谢谢!
答案 0 :(得分:0)
将所有间隔结束符与字段ov值+1表示间隔开始并将-1字段表示间隔结束一起放入数组或列表(因此[6, 10]
给出两对(6,1) and (10,-1)
)
按第一个元素对数组进行排序(如果出现平局,则说明第二个元素)
制作ActiveCounter = 1
ActiveCounter
遍历列表,将对的第二个元素添加到ActiveCounter
。
ActiveCounter
变为1时-开始输出间隔,当其值从1更改为另一个值时-结束输出间隔。