使分段与左端成对分离

时间:2014-02-08 03:31:15

标签: algorithm

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

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

主要问题是使所有对从左端成对分离。如果它们是两个重叠对,如[1,3]和[1,4]那么将它们改为[1,3]和[4,4] ]。处理它的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

这是下面概述的贪婪解决方案。首先,根据左端对细分进行排序,并根据其右端打破关联。现在,浏览一系列细分。如果当前段的左端与前一段的左端重合,则只需将当前段增加1.如果当前段的左端小于前一段,则使当前段的左端= left_end_of_previous_segment+1。否则保持左端不变。现在,如果我们更改任何段的左端,请确保右端至少与左端一样大。该算法需要O(NlgN + N)时间

顺便说一下,如果你可以改变任何终点并且没有移动的条件,你可以很容易地做到这一点。只需运行循环并使所有左端和右端= i + 1

for(int i = 0; i < N; i++) {
    left[i]  = i+1;
    right[i] = i+1;
}

上面的代码确保所有左端都是不同的,但我认为还有其他一些你错过的情况,可能吗?就像,你不被允许向右移动?