您应该找到最长的连续递增子序列, 可以在 O(n log n) (通过排序数组) 中完成, 在此之后, 需要的更改数量是 < code> N - 最长的连续递增子序列 code > 。 请注意, 连续的我意指排序数组的顺序 。
例如:
1 7 6 2 5 4 3 => 1-2-3 is longest consecutive increasing subsequence,
number of moves needed is 4.
1 6 4 3 5 2 7 => 1-2 or 4-5 or 6-7 is longest consecutive increasing
subsequence, note that 1-4-5-7 is longest increasing subsequence but
number of moves needed is 5 not 3.
为何如此成功:
最佳算法不会更改某些项目的位置, 调用最大的子序列而不更改为 < code> X < / code >, 您在操作期间不会改变 < code> X < / code > 项的位置, 因此它们应该以递增模式进行排序。 但是由于您只是允许在数组的第一个或最后一个移动某些项目, 您不能在 < code> X < / code > 项之间放置任何项目( 注意我们假设 < code> X code > 是操作期间最大的未改变的子序列), 所以在操作期间, 不应该在 < code> X < / code> 项之间有间隔。 因此, 它们应该排序和排序格式连续排列 。
因此需要的更改数量不能小于 X < / code > 的 < code> N- 长度, 但也并不难用 X 操作 < / code > 的 < code > N- 长度完成您的工作。