理论上可以通过只移动未排序的元素,在 length(array) - length(longestIncreasingSubsequence(array))
步内将数组排序。
如果唯一允许的操作是原地移动,即每次仅移动一个元素,通过从索引 A 删除一个元素并重新插入到索引 B 中,如何生成正确的移动步骤以获得排序后的数组?同样,需要执行 length(array) - length(longestIncreasingSubsequence(array))
步。
例如,这里有一个数组:
[ 1, 8, 5, 2, 4, 6, 3, 9, 7, 10 ]
最长递增子序列是:
[ 1, 2, 4, 6, 7, 10 ]
这些元素的索引是:
[ 0, 3, 4, 5, 8, 9 ]
所以,我们需要移动的索引是:
[ 1, 2, 6, 7]
因为这些索引目前没有按照顺序排列,所以需要进行排序。
为了得到一个有序数组,这4个元素的最终索引为:
[ 7, 4, 2, 8]
因此,我们需要同时将索引1移动到索引7,将索引2移动到索引4,将索引6移动到索引2,并将索引7移动到索引8。问题在于,当一个元素被移动时,其他元素会发生移位,从而使后面的移动操作变得无效。我尝试过转换这些索引,但迄今为止还没有得出所需的正确移动列表。有什么想法吗?希望我已经解释清楚了问题。请提问,我会澄清的。谢谢!
1<>7
后,您将所有对7
的前向引用替换为1
,反之亦然,则7<>8
将变为1<>8
,这三个值将处于正确的位置。 - Ian Mercer