繁体   English   中英

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

[英]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的大小为Nhelper数组来完成。 此阵列将在位置存储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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM