首先让我们回想起反转的定义。
包含数字的某个序列S的反转是当S [i]> 1时的情况。 S [j]和i< j或坦率地说出我们有混乱因素的情况。例如序列:
1 4 3 7 5 6 2
我们有以下反转(4,3),(4,2),(3,2),(7,5)等。
我们陈述如下问题:反转距离是两个反转值之间的最大距离(就索引而言)。例如,我们可以进行人脑搜索,它们给出了对(4,2)< => (S [1],S [6]),索引距离为6-1 = 5,这种情况下最大可能。
通过查找所有反转并保持最大距离(或者如果我们找到更好的选项更新),可以在O(n ^ 2)中通过简单的方法解决此问题 我们还可以使用合并排序执行更好的反演搜索,因此在O(nlogn)中执行相同的操作。是否存在O(n)算法的可能性?请记住,我们只想要最大距离,我们不想找到所有的倒置。请详细说明。
答案 0 :(得分:1)
是的,O(n)算法是可能的。
我们可以用贪婪算法提取严格增加的子序列:
source: 1 4 3 7 5 6 2
strictly increasing subsequence: 1 4 7
然后我们可以向后提取严格减少的子序列:
source: 1 4 3 7 5 6 2
strictly decreasing subsequence: 1 2
请注意,在发现严格减少的子序列之后,我们可以将其解释为递增序列(在正常方向上)。
对于这些子序列的每个元素,我们需要将它们的索引存储在源序列中。
现在"反转距离"可以通过合并这两个子序列找到(类似于OP中提到的合并排序,但只需要一个合并传递):
merge 1 & 1 ... no inversion, advance both indices
merge 4 & 2 ... inversion found, distance=5, should advance second index,
but here is end of subsequence, so we are done, max distance = 5
答案 1 :(得分:1)
也许我的想法和@Evgeny一样。 以下是解释:
make a strictly increasing array from the beginning we call it array1
make a strictly decreasing array from the ending which is array2 (But keep the values in increasing order)
***Keep track of original indexes of the values of both arrays.
Now start from the beginning of both arrays.
Do this loop following untill array1 or array2 checking is complete
While( array1[index] > arry2[index] )
{
check the original distance between array1 index and arry2 index.
Update result accordingly.
increase array2 index.
}
increase both array index
Continue with the loop
在此过程结束时,您将获得最大结果。这个解决方案的证明并不复杂,您可以自己尝试。