277. Find the Celebrity

真心不会,想了很久,看提示是Array,仍然没有头绪,最后看的别人的做法。

可以用directed-graph的思路来考虑。

要求的celebrity要满足2个条件:
1所有人都认识他
2他不认识任何人

另外一个很重要的条件是,只存在一个celebrity,其实一开始做不出来就是这个条件没有利用好。

假如我们按照
A knows B, then A ===> B
来建立有向图。

首先看条件2,celebrity doesnt know anyone,图里表示就是他没有到任何其余点的路径。
我们从任何一个点开始,顺着路走,只走没走过的点,比如从0到1了,即便1有到0的路我们也不走,只看2 3 4....是否有路。

最终会停止在一个没有out edge的点。然后重新遍历,看看是不是所有点都能到它,是不是它不能到之前的任何点就行了。。

如果有celebrity是不会漏掉的,假如我们最终停在3上。
按大小遍历,假如celebrity的数比3大,那我们会停在3之前,如果比3小,那么因为在3停了,说明3不认识celebrity。。

惨,这题确实不会。
思路看的(http://www.cnblogs.com/yrbbest/p/5034846.html)

/* 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) 
    {
        int res = 0;
        for(int i = 1; i < n; i++) if(knows(res,i)) res = i;
        
        for(int i = 0; i < n; i++) 
            if(i == res) continue;
            else 
                if(!knows(i,res)) return -1;
                else if(knows(res,i)) return -1;
        
        
        return res;
        
        
    }
}
原文地址:https://www.cnblogs.com/reboot329/p/5965861.html