25 匹马 5 条赛道,最快需要几轮求出前 3 名?

请点赞关注,你的支持对我意义重大。

🔥 Hi,我是小彭。本文已收录到 GitHub · AndroidFamily 中。这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] 带你建立核心竞争力。

前言

  • 在计算机面试中,逻辑类题目是规模以上互联网公司的必考题。由于题目花样百出,准备难度较大,题海战术可能不是推荐的做法。
  • 在这个系列里,我将精选十道非常经典的逻辑题,希望能帮助你找到解题思路 / 技巧。如果能帮上忙,请务必点赞加关注,这真的对我非常重要。

系列文章


1. 题目描述

给定 25 匹马与 5 条赛道,一个赛道只能容纳一匹马,每轮比赛只能得到 5 匹马之间的快慢程度,而不是速度,求决胜 1,2,3 名至少多少轮。


2. 解题关键

2.1 分治思想

欲求得 25 匹马中的前三名,可以先求得较小规模问题中的前三名,再合并小规模问题的解得出最终解。

2.2 代表元法

在并查集(一种数据结构)中,会使用根节点来代表一个集合,这种方法叫做代表元法。我们可以借鉴这种 “代表元” 的思想,让一组马中跑的最快的一匹来代表整组马。举个例子,给定一组赛马 A 1 , A 2 , A 3 , A 4 , A 5 A_1,A_2,A_3,A_4,A_5 A1,A2,A3,A4,A5 A 1 A_1 A1为这组马中冠军马,若有 B 1 > A 1 B_1>A_1 B1>A1,则自然有 B 1 > A B_1>A B1>A(即:如果 B 1 B_1 B1 A A A 组中跑的最快的一匹马还快,自然可以得出 B 1 B_1 B1 A A A 组所有马都快的结论)。

提示: 若不了解并查集,请务必阅读我之前写过的一篇文章:《数据结构 | 并查集 & 联合 - 查找算法》


3. 解决问题

理解了分治和代表元后,现在可以说问题的解法了,一共分为 2 个回合来解决:

3.1 第一回合

首先,我们将 25 匹赛马分为 5 组,让每组马进行组内比赛,得到组内排名,假设结果为 A 1 > A 2 > A 3 > A 4 > A 5 A_1>A_2>A_3>A_4>A_5 A1>A2>A3>A4>A5(此时进行了 5 轮比赛)。因为组内排名第四与第五名不可能竞争全场前三名,所以排除每一组的第四与第五名。

A 组 : { A 1 , A 2 , A 3 , A 4 , A 5 } A 组:\{A_1,A_2,A_3,A_4,A_5\} A{A1,A2,A3,A4,A5}

B 组 : { B 1 , B 2 , B 3 , B 4 , B 5 } B 组:\{B_1,B_2,B_3,B_4,B_5\} B{B1,B2,B3,B4,B5}

C 组 : { C 1 , C 2 , C 3 , C 4 , C 5 } C 组:\{C_1,C_2,C_3,C_4,C_5\} C{C1,C2,C3,C4,C5}

D 组 : { D 1 , D 2 , D 3 , D 4 , D 5 } D 组:\{D_1,D_2,D_3,D_4,D_5\} D{D1,D2,D3,D4,D5}

E 组 : { E 1 , E 2 , E 3 , E 4 , E 5 } E 组:\{E_1,E_2,E_3,E_4,E_5\} E{E1,E2,E3,E4,E5}

第一回合

3.2 第二回合

其次,每一组跑得最快的一匹马作为代表元参与一轮 “代表赛”,假设比赛结果是: [ A 1 > B 1 > C 1 > D 1 > E 1 ] [A_1>B_1>C_1>D_1>E_1] [A1>B1>C1>D1>E1],由此可以排除失去竞争资格的赛马:

  • A 1 A_1 A1 是代表赛中最快的,所以 A 1 A_1 A1 一定是全场第一名;

  • B 1 B_1 B1 是代表赛中的第二名,最快情况下 B 1 B_1 B1 同时也是全场的第二名,则 B 3 B_3 B3 前面还有 B 2 B_2 B2,所以 B 3 B_3 B3 失去竞争前三名的资格;

  • C 1 C_1 C1 是代表赛中的第三名,最快情况下 C 1 C_1 C1 同时也是全场的第三名,则 C 2 、 C 3 {C_2、C_3} C2C3 失去前三名的竞争资格;

  • D 1 D_1 D1 D 1 D_1 D1 是代表赛的四五名,说明 D 组和 E 组都失去了前三名的竞争资格;

第二回合

3.3 第三回合

此时,剩余的未知顺序的赛马正好有 5 匹,加赛一轮就可以得出第二名和第三名的归属。三个回合总共进行了 7 轮比赛,故答案就是 7。

{ A 2 , A 3 } \{A_2,A_3\} {A2,A3}

{ B 1 , B 2 } \{B_1,B_2\} {B1,B2}

{ C 1 } \{C_1\} {C1}

论毕。


我是小彭,带你构建 Android 知识体系。技术和职场问题,请关注公众号 [彭旭锐] 私信我提问。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彭旭锐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值