排列数组中的行以消除增加的子序列

Posted

技术标签:

【中文标题】排列数组中的行以消除增加的子序列【英文标题】:Permuting rows in an array to eliminate increasing subsequences 【发布时间】:2011-11-07 03:25:12 【问题描述】:

以下问题取自Problems on Algorithms(问题653):

给你一个 n x 2 的数字矩阵。找到一个 O(n log n) 算法,该算法对数组中的行进行置换,使得数组的任何一列都不包含长于 ⌈√n 的递增子序列(可能不包含连续的数组元素)。⌉

我不确定如何解决这个问题。我认为它可能会使用某种分而治之的循环,但我似乎找不到。

有人知道如何解决这个问题吗?

【问题讨论】:

长于n的平方 是《算法问题》一书中的653题 这里是本书pdf的链接:larc.unt.edu/ian/books/free/license.html 我认为它的分而治之我怀疑合并步骤也涉及一些数学。 【参考方案1】:

这是我的解决方案。

1) 根据第一个元素从大到小对行进行排序。

1 6    5 1
3 3 -\ 3 3
2 4 -/ 2 4
5 1    1 6

2)将其分成⌈√n⌉组,剩下的(不超过⌈√n⌉组)

5 1    5 1
3 3 -\ 3 3
2 4 -/ 
1 6    2 4
       1 6

3) 根据第二个元素从大到小对每组中的行进行排序

5 1    3 3
3 3    5 1
    -> 
2 4    1 6
1 6    2 4

正确性证明:

第 1 列的子序列增加只能在单个组中发生(大小为

第2列递增子序列中没有2个元素在同一组(不超过⌈√n⌉组)

【讨论】:

啊,太简单了。为什么我没看到?干得好。 大约 5 分钟。我开始思考如何解决 1xn 问题(单列)。 铅笔和纸总是有帮助的。

以上是关于排列数组中的行以消除增加的子序列的主要内容,如果未能解决你的问题,请参考以下文章

最长递减子序列问题

最长递减子序列问题

最长递减子序列问题

「力扣」第 1673 题:找出最具竞争力的子序列(栈)

「力扣」第 1673 题:找出最具竞争力的子序列(栈)

「力扣」第 1673 题:找出最具竞争力的子序列(栈)