腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?

这里记录了两种解题的思路

第一步:64匹马分别进行比赛,不在前4的马 淘汰掉。此时剩余 8组,每组4个  共32匹马       (8场)

第二步:8组里的第一名赛一场,不在前四的马连同所在的组 淘汰掉,此时剩余 4组,每组4个  共16匹马   (1场)

前面两步是一样的,画风突变在后面

其中一种解法(有概率在里面)

第三步:将第二步里排名1,2的两匹马所在的组进行比赛,这里有两种情况可以完成查找(1场)  此时总共是10场比赛

(1)这里如果第二步排名第二的马(暂且称它"勒马")此次排名>=4,那么排名前4的就是最快的4匹                           马了 

(2)如果"勒马" 排在第三位那么第四名肯定就是第二步里的第三名了  

第四步:如果"勒马" 排在第二名这就说明 第3,4名 可能是第二步的第三名的组里,最坏的情况下还需要2场比赛才能选出来   所以最终比赛场数 10场-12场

------------------------------------------------分割线-------------------------------------------------------

另一种解法(很稳的一种)

因为第二步的原因,我们肯定能找出来一匹一直跑第一的马(暂且称"神马"),那么就能确定最快的马里第一的位置一定是"神马"了,那接下来 我们只要找第2-4快马就可以

第三步:排除"神马"还剩15匹马,再取第一名组的剩余三匹马,第二名组的前三,第三名组的前二,第四名组的前一,其他全部淘汰,还剩9匹马,选八匹马出来再比一场可以得出前三名

(详解:因为第一名已经有了,第一组的剩余三匹马有可能是剩下三名,第二组前三也有可能,第三组的前二加上第二组的第一名也有可能,

第四组的第一加上第三组的第一加上第二组的第一也有可能是剩余的三名最快的马,这里看不懂的无法理解的可以多想想)

第四步:(1场)

最后拿前三名和剩余一个没有比的在比一场,取前三,加上第一名,就是最快的四匹马,所以最终比赛常数是11场

解题的思路有点动态规划的思想,前面的结果对后面有影响,

------------------------------------------------分割线-------------------------------------------------------

ps:用代码实现的话  ,可以使用一个或多个排序数组,将已经同场竞技过的马的顺序记录下来,共后面步骤去做选择,思路还不成熟,等想明白了 再来完善。。

你可能感兴趣的:(腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?)