使数组排序的最小操作数

时间:2012-05-26 03:24:24

标签: arrays algorithm sorting

我在spoj上一直在尝试this问题,但却无法提出正确的方法。 什么是解决问题的正确算法?

1 个答案:

答案 0 :(得分:8)

您应该找到最长的连续增加子序列,可以在O(n log n)中完成(通过排序数组),之后,所需的更改数量为N - longest consecutive increasing subsequence。请注意,连续我的意思是排序数组中的顺序。

e.g:

  

1 7 6 2 5 4 3 => 1-2-3是连续增加最长的子序列,   所需的移动次数为4次。

     

1 6 4 3 5 2 7 => 1-2或4-5或6-7是最长的连续增加   后续,请注意1-4-5-7是增长最长的子序列但是   所需的移动次数为5次而不是3次。

为什么会这样:

最佳算法不会更改某些项目的位置,调用最大的子序列而不更改X,在操作期间不会更改彼此相关的X项的位置,因此应对它们进行排序在增加模式。但是因为你只是允许在数组的第一个或最后一个中移动一些项目,所以你不能在X个项目之间放置任何项目(请注意,我们假设X是操作期间最大的未更改的子序列),所以X项之间应该没有差距。因此它们应按排序格式排序和连续。

因此,所需的更改次数不能小于N- length of X,但使用N-length of X operation并不难做到这一点。