一种算法,以递增和递减顺序删除列表中最少的数字?

时间:2013-08-15 01:37:54

标签: algorithm list analysis puzzle

考虑以下数字:

9,44,32,12,7,45,31,98,35,37,41,8,20,27,83,64,61,28,39,93,29,92,17,13 ,14,55,21,66,72,23,73,99,1,2,88,77,3,65,83,84,62,5,11,74,68,76,78,67,75 ,69,70,22,71,24,25,26。

我尝试实现一种算法来删除列表中最少的数字来生成序列

a)增加订单 b)降序

我已经尝试过最短,最长的时间。不想要代码,只需要解释或伪代码,我无法理解如何解决问题谢谢!

2 个答案:

答案 0 :(得分:2)

这是一个轻微伪装的Longest increasing (decreasing) subsequence问题。解决问题的算法如下:

  • 查找数组中最长的(递减)子序列
  • 删除所有不属于最长增长子序列的元素。

由于增加/减少子序列最长,因此您删除的数字量最小。

维基百科文章有一个很好的伪代码来解决LIS / LDS问题。您可以将二进制搜索替换为线性搜索,除非原始序列长度超过1000个元素。

答案 1 :(得分:0)

既然已经提到过,我会加2美分。在这些情况下,很可能会在面试中询问,运行时间(效率)是一个主要问题。因此,许多算法可以解决同样的问题,具体取决于执行时间。 最着名的算法是O(nlogn)。其他重要的一个可以像动态编程范例一样也可以应用于产生O(n ^ 2)的解。

O(n^2) here

O(nlogn) here