1. 题目描述 Problem Description

Leetcode 277. Find the Celebrity

Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, there may exist one celebrity. The definition of a celebrity is that all the other n - 1 people know him/her but he/she does not know any of them.

Now you want to find out who the celebrity is or verify that there is not one. The only thing you are allowed to do is to ask questions like: "Hi, A. Do you know B?" to get information of whether A knows B. You need to find out the celebrity (or verify there is not one) by asking as few questions as possible (in the asymptotic sense).

You are given a helper function bool knows(a, b) which tells you whether A knows B. Implement a function int findCelebrity(n), your function should minimize the number of calls to knows.

Note: There will be exactly one celebrity if he/she is in the party. Return the celebrity's label if there is a celebrity in the party. If there is no celebrity, return -1.

2. 题目解析(参考了Prof. Sarrafzadeh 180讲的内容)

首先题目定义了:如果一个人A是名人,那么其他的n-1个人都认识A,而且A不认识其他的n-1个人。这题的目标是要从n个人中找出其中的名人,如果没有,则告知其中没有名人。我们可以调用knows(a,b)函数来询问a是否认识b,而我们要尽量少调用这个函数。

这题的关键是理解题意,题意其实比较容易理解错,所以有几个小问题可以帮大家理解:

(1)n个人中最多可以有几个名人?

答案:是1个。如果这n个人中有2个名人分别为A和B,那么按照定义,如果一个人A是名人,那么其他的n-1个人都认识A,而且A不认识其他的n-1个人,这也就是说A不认识B。但与此同时我们又定义了如果一个人B是名人,那么其他的n-1个人都认识B,那么A也应该认识B。这就产生了 contradiction了。因此其中不可以有2个或2个以上的名人。

(2) 如果其他n-1个人都认识A,但是A认识了n-1个人中其中一个人,那么A还是名人吗?

答案:不是的。

(3) 如果A不认识其他的n-1个人,但是n-1个人中有人不认识A,那么A还是名人吗?

答案:不是的。

-

这题最直接的想法应该是暴力,但是暴力的复杂度是多少呢?对于每个人我们需要询问:

(1) 他是否认识剩下的n-1个人: 最坏的情况需要调用knows(a,b)函数n-1次

(2) 剩下的n-1个人是否认识他:最坏的情况需要调用knows(a,b)函数n-1次

有的可能会重复,但是总体来说需要询问的次数是$\frac{n(n-1)}{2}$。即时间复杂度为 O($n^2$)

-

有没有办法优化算法?

如果我们从n个人中任意挑两个人a,b出来,询问a是否认识b,那么只有两种情况:

(1)a认识b:那么a肯定不是名人。

(2)a不认识b:那么b肯定不是名人。

所以任何一种情况,我们都可以排除掉2个人中的一个人。如果我们不断地重复的这个过程,直到只剩下一个人,那么我们会做n-1次对比。而剩下这个人是唯一可能成为名人的人,那么我们需要询问剩下的n-1个人是否认识他,也需要询问他是否认识剩下的n-1个人。

因此我们一共需要询问3(n-1)次——时间复杂度为O($n$)。

3. Python 实现

1 #The knows API is already defined for you.

2 #@param a, person a

3 #@param b, person b

4 #@return a boolean, whether a knows b

5 #def knows(a, b):

6

7 classSolution(object):8 deffindCelebrity(self, n):9 """

10 :type n: int11 :rtype: int12 """

13 if n ==0:14 return -1

15 curr_stay =016 for i in range(1, n):17 ifknows(curr_stay, i):18 curr_stay =i19 for i inrange(0, n):20 if i ==curr_stay:21 continue

22 ifknows(curr_stay, i):23 return -1

24 if notknows(i, curr_stay):25 return -1

26 returncurr_stay27

python领域的名人_名人问题 算法解析与Python 实现 O(n) 复杂度 (以Leetcode 277. Find the Celebrity为例)...相关推荐

  1. python比java慢_对于这种算法,Python与Java相比非常慢

    我正在研究算法,并决定将Java程序从教科书移植到Python,因为我不喜欢Java的开销,特别是对于小程序来说,这是一种练习.在 算法本身非常简单,它只是以一种蛮力的方式从数组中取出所有的三元组,然 ...

  2. python比较两个列表的重合度_#源代码#超几何分布算法介绍及python下的实现代码...

    原标题:#源代码#超几何分布算法介绍及python下的实现代码 超几何分布是统计学上一种离散概率分布.它描述了由有限个物件中抽出n个物件,成功抽出指定种类的物件的次数(不归还). 在产品质量的不放回抽 ...

  3. python领域语言教案_第一单元 走进Python 编程世界

    (共17张PPT) 今年一场突如其来的新冠肺炎不仅使得人人带上了口罩,过了一个不一样的寒假,同时也使得我们以不一样的方式开启我们的学习. 同学们你们知道那些人容易得肺炎重症呢? 有基础病的 身体素质差 ...

  4. python基础刷题_数据结构与算法LeetCode刷题(Python)

    参考资料: 一.链表 1.  链表的必备知识要点(包括基础知识.刷题中使用的STL等知识) 2.  链表逆序(LeetCode 92 ,206. Reverse Linked List 1,2) 3. ...

  5. python潜力开源项目_比较了1000多个Python开源项目,精选出这34个

    传智播客博学谷 微信号:boxuegu- get最新最全的IT技能 免费领取各种视频资料 在过去的一年里,Mybridge比较了近1000个的Python开源库,并从中评选出34个最有用的工具来帮助你 ...

  6. python k线合成_手把手教你写一个Python版的K线合成函数

    手把手教你写一个Python版的K线合成函数 在编写.使用策略时,经常会使用一些不常用的K线周期数据.然而交易所.数据源又没有提供这些周期的数据.只能通过使用已有周期的数据进行合成.合成算法已经有一个 ...

  7. python交互界面实例_什么是“面向对象”程序设计-以Python为例

    面向对象的概念 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理 ...

  8. python交互界面实例_什么是“面向对象”程序设计以Python为例

    面向对象的概念 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理 ...

  9. python递归算法案例教案_电子教案 第8章 Python计算生态

    全国计算机等级考试二级教程全国计算机等级考试二级教程 Python语言程序设计语言程序设计 (2020年版) 知识兔w w w . z h is h it u . c o m [第[第8章]章] Py ...

最新文章

  1. Metro中文件夹和文件的创建
  2. CSP认证201512-4 送货[C++题解]:无向图欧拉路径、并查集、dfs
  3. mysql insert into select大量数据插入比较慢_史上最全MySQL锁机制
  4. 创建vue-cli项目
  5. 2018 多校联合训练 10
  6. 正则表达式之 NFA 引擎匹配原理详解
  7. python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法
  8. 【Eclipse 插件】Subclipse
  9. faster rcnn一些博客
  10. 排序算法之 Heap Sort
  11. python矩阵乘法算法_纯python进行矩阵的相乘运算的方法示例
  12. jquery ajax html 解析,jquery ajax请求实例深入解析
  13. Linux vi 替换字符串
  14. 项目案例:浙江宁波江北区道路照明智慧化改造见成效
  15. cad lisp 管道截面_CAD计算材料截面特性插件-cad计算截面特性插件稳定免费版-东坡下载...
  16. 开发者的固化思维及解决办法
  17. oracle+suspend+参数,oracle数据库的挂起(Suspending)和恢复(Resuming)
  18. Struts2的学习 主要是知识点和基础知识
  19. android rfid 定位,基于Android手机的室内定位技术研究与实现
  20. Java平台,标准版Oracle JDK 9中的新功能

热门文章

  1. 如何零基础自学平面广告设计
  2. 这是我的故事 —— 胡浩
  3. 联想 p系列服务器,全面解读联想ThinkStation P系列工作站
  4. Java 面试 宝典 (2)
  5. Java二维数组声明与初始化
  6. Java 在二维坐标系绘制矩形、圆形、多边形
  7. 程序员的一些感悟,都活成自己想要的样子了吗?
  8. 【工具编写】python实现非对称加密RSA算法
  9. \0 的ASCII码值是多少
  10. CVE-XX-XX:“Atom截胡”Windows内核提权漏洞分析