我正在阅读“算法导论:创造性方法”并在第1章中遇到了这个问题:
问题1.3:你有一个数字列表,尽可能少地删除数字以使剩余数字按递增顺序排列。
例如,给定数组
9 44 32 12 7 42 34 92
两种可能的选项是9 12 42 92
和32 42 92
,前者删除的数字较少。
我尝试了一种递归算法,但对其性能不满意,因为它仍然需要测试太多组合。我发现了一种可以快速获得良好结果的启发式算法,但我不确定它是否可以保证最佳结果。我在网上搜索但没有找到关于这个问题的任何讨论。我相信应该有更好的算法。
我写了两个方法here,以防你想检查。
更新:我正在问这个问题的解决方案,@ josilber和@templatetypedef给出了链接和正确的方向来查看。事实证明,这是一个具有良好解决方案的已知问题家族的特例。这里没有必要编写详细的解决方案,最长的子序列的维基页面,耐心排序提供了详细的信息。
值得注意的是,虽然答案有一些链接,但这个问题并不是要求资源或链接。真正的答案是“这个问题是一些已知解决问题的变体”的知识。
答案 0 :(得分:6)
作为提示,这相当于找到数组中增长最长的子序列(你明白为什么吗?)既然这是一个已知O(n log n)解决方案的标准算法,你应该能够解决略微修改LIS的问题。
希望这有帮助!