[1 2 .. N]置换的最长增加子序列

时间:2014-12-13 06:15:58

标签: arrays algorithm permutation

问题在于:

给定N个元素(1到N)的数组,使用一个约束对数组进行排序:您只能将元素移动到数组的开头或数组的末尾。您至少需要对阵列进行多少次排序?

例如:2 5 3 4 1 => 1 2 5 3 4 => 1 2 3 4 5,所以我至少需要2步。

我找到了一个解决方案:N - length of longest increasing subsequence,在上面的例子中是5 - 3 = 2的答案。

我知道O(NlogN)算法可以找到增长最长的子序列(LIS)。但是如果数组中的元素在[1, N]中,我想知道是否有O(N)解决方案来查找数组的LIS?

或者是否有一个O(N)解决方案来解决初始问题,因为我们知道元素从1到N?

1 个答案:

答案 0 :(得分:2)

您正在寻找的是增长最快的序列,其中任意两个连续元素之间的差异为1

仅仅查找增长最长的序列是不够的,例如1 5 3 4 2最长的inc seq长度为3,但问题只能在3步骤中解决{{1}据我所知。

通过分配2大小1数组,可以在O(N)时间和O(N)空间中查找差异为helper的最长inc seq例如,初始化为所有N。此数组将在0位置存储最长子序列的长度i,如果尚未看到i则为i

然后您浏览未排序的数组,当您找到元素0时,设置x并更新helper[x] = helper[x-1] + 1变量。

最后,排序成本为max

示例:

input_array.length - max