减少间隔到不重叠的子间隔

时间:2019-11-12 05:51:44

标签: algorithm data-structures

给出一组带有开始时间和结束时间的间隔,

[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)解决方案,即对于每个间隔,通过重复遍历数组来每隔一个间隔减小一次,但是我正在寻找更有效的算法思路。谢谢!

1 个答案:

答案 0 :(得分:0)

将所有间隔结束符与字段ov值+1表示间隔开始并将-1字段表示间隔结束一起放入数组或列表(因此[6, 10]给出两对(6,1) and (10,-1)

按第一个元素对数组进行排序(如果出现平局,则说明第二个元素)

制作ActiveCounter = 1 ActiveCounter

遍历列表,将对的第二个元素添加到ActiveCounter

ActiveCounter变为1时-开始输出间隔,当其值从1更改为另一个值时-结束输出间隔。