这题因为 leetcode锁起来,所以我们跑去做Lintcode上面的第 645题 Find the Celebrity
从派对里面找名人,要是名人的条件有二
可以利用它提供的 API 获取A是否认识B,比方说这样调用Celebrity.knows(a, b),返回值是True 代表认识,False代表不认识。
一个派对最多只有一个名人,如果有名人回传他的下标值,没有的话回传 -1。目标是调用最少次题目提供的 API
首先假设第一个人是名人(用head 表示现在谁有可能是名人),开始循环剩下人,思维有以下两个
如此循环完成後,可以得到 head 现在是最有可能是名人的人,然後他不认识大家没有用,还必须要大家都认识他,因此循环一次,一但有人不认识他,代表所有人里面没有人还有可能是名人。
最後因为一直以来 head 都是不知道 head 以後的人是谁,所以 head 还有可能知道他前面的人是谁。因此还需要跑一次回圈确定前面的人他都不认识。
class Solution:
# @param {int} n a party with n people
# @return {int} the celebrity's label or -1
def findCelebrity(self, n):
# 首先假设第一个人是名人(用head 表示现在谁有可能是名人)
head = 0
for i in range(1, n):
# 如果head 不知道下一个人是谁,下一个人就一定不是名人,head 保持不变
if not Celebrity.knows(head, i):
continue
# 如果 head 知道下一个人是谁,就代表 head 一定不是名人,所以现在第 i 个人有可能是
else:
head = i
# 还必须要大家都认识他,因此循环一次
for i in range(n):
if not Celebrity.knows(i, head):
head = -1
break
# head 还有可能知道他前面的人是谁。因此还需要跑一次回圈
for i in range(0, head):
if Celebrity.knows(head, i):
head = -1
break
return head
>>: SQL Server 记录档的问题与解决方案 - 心得分享
因为上一个自我挑战,我耍白痴,打完忘记按发表,所以只能再重新ㄌ呜呜 希望我这次不会再耍白痴了? 嘎油...
Veeam Backup专业级备份软件从入门到实战_01 课程大纲: 1.Veeam公司介绍 2.V...
今天要来说到专题实作的部分,预想的设计大致都有完整做出来。 第一个是我们设置日历元件 接着介绍一下我...
PostgreSQL 多笔 update 方式探讨 前言 看到FB上 Backend 台湾 (Bac...
前言 工作术不只是工作上,还有自己想做的事情,目的都是在一样的时间内做更多事情,且挤出更多时间。 聪...