真心不会,想了很久,看提示是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;
}
}