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.

137/160

参考了disuccision

思路:先扫一遍,选出potential candidate。因为candidate不认识其他人,所以一旦know(candidate,i),我们立即淘汰这个candidate,更新为i。最后的情况是,之前的candidate因为know其他i,所以都被淘汰了。然后再扫一遍,看看是不是真的是celebrity。因为当你更新这个candidate时候,在这个candidate之前 i 的情况是没有考虑的,注意边界条件candidate know candidate heself需要排除。

/* 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<=1)return -1;
        int candidate=0;
        for(int i=1;i<n;i++){
            if(knows(candidate,i)) candidate=i;
        }
        for(int i=0;i<n;i++){
            if(i!=candidate&&(knows(candidate,i)||!knows(i,candidate)))return -1;
        }
        return candidate;
    }
}

 

posted on 2016-10-13 12:08  Machelsky  阅读(188)  评论(0编辑  收藏  举报