问题在于:
给定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?
答案 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