277. Find the Celebrity

来源:互联网 发布:剑三成男纯阳捏脸数据 编辑:程序博客网 时间:2024/05/21 08:03

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.


/* The knows API is defined in the parent class Relation.      boolean knows(int a, int b); */public class Solution extends Relation {    public int findCelebrity(int n) {        if(n <= 0){            return -1;        }        int candidate = 0;        for(int i=1; i<n; i++){            if(knows(candidate, i)){                candidate = i; //从第二个人开始数,如果有人认识此人,则把此人设为candidate            }//因为celebrity不认识任何人,所以一旦candidate认识i,那么candidate就肯定不是celebrity        }        for(int i=0; i<n; i++){//反向验证,结果返回-1            if(i != candidate && (knows(candidate, i) || !knows(i, candidate))){                return -1; //验证candidate,他不认识任何人,但是任何人都认识他            }        }        return candidate;    }}


0 0
原创粉丝点击