这是一个面试问题,而非作业。
N个朋友正在玩游戏。他们每个人都有自己面前的数字列表。
N个朋友中的每一个都从他的列表中选择一个号码并将其报告给游戏管理员。然后游戏管理员对报告的数字进行排序,并喊出第K个最大数字。
我必须计算游戏管理员可以喊出的所有可能数字。
例如,如果N = 3且K = 3,则3位朋友的列表为2 5 3
,8 1 6
,7 4 9
。输出为6,因为可能的值为4 5 6 7 8 9
。
有人能为这个问题提出一个不错的算法吗?我正在做的是创建所有可能的排列,从每个列表中取一个数字,然后对结果进行排序并打印第k个最大的数字。但这需要太多时间。
答案 0 :(得分:6)
要知道结果中是否存在数字,您需要知道每个其他列表是否有上面的数字以及下面是否有数字。列出上下两个数字的列表不是问题,因为您可以选择适合您的数字。问题是只有上面的数字或下面只有数字的列表。第一个必须至多为N-K,第二个必须至多为K.如果不是这样,则无法选择您的号码。如果这是真的,您可以随时在列表中选择上面和下面都有数字的数字,以便选择您的号码。
这可以在线性时间内检查,或者如果您对列表进行第一次排序则更好,因此总体复杂度为O(n.log(n)),其中n是总数中的数字。如果没有排序,你就会感到难以理解。
在带有列表的示例中:
{2 5 3}, {8 1 6}, {7 4 9}
说我们正在寻找2个最大数字。对于每个号码,我们询问是否可以由管理员喊出来。对于他们中的每一个,我们看看在另一个列表中是否有下面的数字和上面的数字。让我们进一步了解其中一些
对于5:其他列表中都有上下数字。所以“5”可以由管理员大喊。
对于“2”:第二个列表中有上方和下方的数字,因此我可以在此列表中自由选择上方或下方的数字。但是在第三个列表中只有上面的数字,因此此列表中选取的数字将始终更大。因为我可以在第二个列表中自由选择下面的数字,从而使我的“2”成为第二大数字。
对于“1”:第二个列表中只有上面的数字,因此“1”将始终是最小的元素。
对于“9”:这是另一种方式,它总是最好的。
答案 1 :(得分:6)
从每组中取最小数字。找到这些的第K个。这是结果中的最小数字。同样,找到结果中的最大数字。证明两者之间的每个数字都在结果中。