在所有段中成对不同的左端

时间:2014-02-07 19:01:26

标签: algorithm

我提供了M个数组的N个元素的形式[L,R]段。我需要改变这些段,使得所有段都具有成对不同的左端。

示例:假设我们在数组中有5个元素,我们有4个段:[1,2],[1,3],[2,4]和[4,5]然后将所有左端成对不相交我们有[1,2],[3,3],[2,4]和[4,5]。这里所有的段都有不同的左端

1 个答案:

答案 0 :(得分:0)

让我们看看我是否得到了这个。我建议

  1. 您根据右端对所有细分进行排序。
  2. 然后你修复所有的左端,从最小的右端开始向更大的右端方向工作。修复意味着您将当前左端替换为下一个可用值。
  3. 在Python中它看起来像这样:

    def fit_intervals(datalist):
        d1 = sorted(datalist, key=lambda x : x[1])
        taken = set()
        def find_next_free(x):
            while x in taken:
                x = x + 1
            taken.add(x)
            return x
    
        for interval in d1:
            interval[0] = find_next_free( interval[0] )
    
    data = [ [4,5], [1,9], [1,2], [1,3], [2,4] ]
    fit_intervals(data)
    print(data)
    

    输出:[[4,5],[5,9],[1,2],[2,3],[3,4]]

    此函数find_next_free目前使用简单的线性算法,如果有必要,这肯定可以改进。