有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)列表值。所以它不适合记忆。
这个问题还有其他有效的算法吗?
答案 0 :(得分:1)
这是一个有趣的问题,需要一段时间来弄明白。
制作2个最大堆,h1
和h2
。
每次在h1
中放置所有列表的第一个元素,从h1
到h2
放置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)