通过从N个列表中每次挑选一个数字,从N个列表中找到第k个最大数字的高效算法

时间:2014-04-12 21:03:57

标签: algorithm list sorting language-agnostic permutation

有N个数字列表。每次从每个列表中挑选一个号码,所有选中的号码将被排序。第k个最大的已排序数字将被添加到一个集合中。 最后,将报告该集的大小。

例如

3 3

3 2 5 3

3 8 1 6

3 7 4 9

第一个整数是列表N的编号(从下一行有N个列表。在这种情况下它是3,所以接下来的三行有列表值)。第二个整数是k值。接下来N行的第一个条目是列表大小。

列表值是list1 - > (2,5,3),list2 - >(8,1,6),list3 - >(7,4,9)

可以从列表中选择任何号码。例如(2,8,7),(2,8,4),(2,8,9),(2,1,7),(2,1,4),(2,1,9)。 .etc都是有效的组合。根据这种组合,将从每种组合中选择第k个最大值。

在这种情况下,以下数字有可能成为最大的第3个(因为k = 3)

(4,5,6,7,8,9)

必须报告总数。所以输出是6

单向:

我试图找到所有列表值的排列,对其进行排序并且每次都取最大值。以这种方式,复杂性很高。例如,4个大小列表(10,12,15,20)=(10 * 12 * 15 * 20)列表值。所以它不适合记忆。

这个问题还有其他有效的算法吗?

1 个答案:

答案 0 :(得分:1)

这是一个有趣的问题,需要一段时间来弄明白。
制作2个最大堆,h1h2

每次在h1中放置所有列表的第一个元素,从h1h2放置1个元素(最大),当h2 >=K的大小时, 从h2中弹出1个元素(最多)并将其添加到set中。

运行您的案例:

1)h1 =空h2 =空set =空
2)h1 = 2 8 7 h2 =空set =空
3)h1 = 2 7 5 1 4 h2 = 8 set =空
4)h1 = 2 5 1 4 3 6 9 h2 = 8 7 set =空
5)h1 = 2 5 1 4 3 6 h2 = 8 7 9 set =空左 6)h1 = 2 5 1 4 3 h2 = 8 7 6 set = 9
7)h1 = 2 1 4 3 h2 = 5 7 6 set = 9 8
8)h1 = 2 1 3 h2 = 5 4 6 set = 9 8 7
9)h1 = 2 1 h2 = 5 4 3 set = 9 8 7 6
10)h1 = 1 h2 = 2 4 3 set = 9 8 7 6 5
11)h1 =空h2 = 2 1 3 set = 9 8 7 6 5 4

h1 =空,停止。

时间复杂度:O(N log N)