【问题标题】:longest increasing subsequence of a [1 2 .. N] permutation[1 2 .. N] 排列的最长递增子序列
【发布时间】:2014-12-13 06:15:58
【问题描述】:

问题来了:

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

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

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

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

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

【问题讨论】:

  • 您要对数组进行排序还是查找 LIS?
  • 我只想知道使数组排序的最少移动次数。我发现如果LIS的长度已知,问题就解决了。所以我要问的是给定特殊元素的 O(N) 解决方案。

标签: arrays algorithm permutation


【解决方案1】:

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

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

要找到最长的 inc seq,其中 O(N) 时间和 O(N) 空间中的差异是 1,可以通过分配一个大小为 Nhelper 数组来完成,例如,初始化为所有 0。这个数组将存储在位置i 上最长子序列的长度i,如果还没有看到i,它将是0

然后你遍历未排序的数组,当你找到一个元素 x 时,你设置 helper[x] = helper[x-1] + 1 并更新一个 max 变量。

最后,排序的成本是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

【讨论】:

  • emm.. 序列的长度向上 i 是什么意思?
  • 包含i作为最后一个元素并且每两个连续元素相差1的递增元素的子序列的长度。我将添加一个示例。
  • @justmscs 添加了一个示例并编辑了我在原始想法中的一个错误
猜你喜欢
  • 2013-07-03
  • 2014-02-25
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多