题目:
假设你是一个专业的狗仔,参加了一个 n 人派对,其中每个人被从 0 到 n - 1 标号。在这个派对人群当中可能存在一位 “名人”。所谓 “名人” 的定义是:其他所有 n - 1 个人都认识他/她,而他/她并不认识其他任何人。
现在你想要确认这个 “名人” 是谁,或者确定这里没有 “名人”。而你唯一能做的就是问诸如 “A 你好呀,请问你认不认识 B呀?” 的问题,以确定 A 是否认识 B。你需要在(渐近意义上)尽可能少的问题内来确定这位 “名人” 是谁(或者确定这里没有 “名人”)。
在本题中,你可以使用辅助函数 bool knows(a, b) 获取到 A 是否认识 B。请你来实现一个函数 int findCelebrity(n)。
派对最多只会有一个 “名人” 参加。若 “名人” 存在,请返回他/她的编号;若 “名人” 不存在,请返回 -1。
解答:
# The knows API is already defined for you.
# return a bool, whether a knows b
# def knows(a: int, b: int) -> bool:
class Solution:
def findCelebrity(self, n: int) -> int:
#找到可能的名人,并用cur记录
cur=0
for i in range(1,n):
#若cur认识某人,则cur一定不是名人,因为名人不认识任何人
#若当前cur为名人,则cur将不会变动,因为cur不认识任何人
if knows(cur,i):
cur=i
#验证cur是否为名人
for i in range(n):
if i==cur:
continue
#存在一个人不认识cur,则cur不是名人
if not knows(i,cur):
return -1
#cur认识某个人,则cur不是名人
if knows(cur,i):
return -1
return cur