寻找名人
寻找名人
https://labuladong.gitee.io/algo/2/20/44/
寻找名人问题:在 n 人中有一个人是名人,其他人都认识名人,而名人不认识任何人。题目提供了 knows(a, b)
这样一个函数来判断一个人是否认识另一个。
这个题有个有趣的性质:观察两人是否认识,至少可以排除一个人一定不是名人。设一个人为名人候选 candidate
,另一个人记为 other
。两个人之间的关系只可能有 4 种:
candidate
认识other
:因为名人不认识其他人,所以candidate
肯定不是名人,排除candidate
。other
认识candidate
:同理,排除other
。- 两个人互相认识,则他俩都不是名人,因为名人不认识其他人。
- 两个人互不认识,则他俩也都不是名人,因为所有人都认识名人。
开始时,将所有人放进队列,然后每次取出 2 个人观察他们的关系,根据上面的关系排除掉一个人(如果是两个人都不是名人的情况,随便排除一个,方便写代码),将另一人归回队列中,直到只剩下一个人。然后再遍历一次其他人来检查这个人是否是名人。
1 |
|
也可以再简化,把队列去掉,每次只维护一个候选人变量即可,排除掉一个人时就让另一个成为候选。