[英]longest increasing subsequence of a [1 2 .. N] 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
。
只是找到最长的增加序列是不够的,例如1 5 3 4 2
,最长的inc seq长度为3
但问题只能在3
步骤中解决,而不是2
,据我所知。
为了找到O(N)
时间和O(N)
空间中差值为1
的最长inc seq,可以通过分配例如初始化为全0
的大小为N
的helper
数组来完成。 此阵列将在位置存储i
的最长子序列的长度可达i
并且如果i
尚未见过的这将是0
。
然后你通过未排序的数组,当你找到一个元素x
你设置了helper[x] = helper[x-1] + 1
并更新了一个max
变量。
最后,sort的成本是input_array.length - max
例:
array: 3 1 2
0 1 2 3
helper: 0 0 0 0
max = 0
step 1:
check element at position 1 which is 3. helper[3] = helper[3 - 1] + 1 == 1:
0 1 2 3
helper: 0 0 0 1
max = 1
step 2:
check element at position 2 which is 1. helper[1] = helper[1 - 1] + 1 == 1:
0 1 2 3
helper: 0 1 0 1
max = 1
step 3:
check element at position 3 which is 2. helper[2] = helper[2 - 1] + 1 == 2:
0 1 2 3
helper: 0 1 2 1
max = 2
cost = 3 - 2 = 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.