本题不算难,但是其实并不好想到的算法
celebriy:
- 所有人都知道他
- 他不知道任何人
最核心的代码是First Pass:
for (int i = 1; i < n; ++i) {if (knows(candidate, i)) {// update candidatecandidate = i;}}
- 如果Candidate不知道别人:
- 如果candidate是celebrity,那那个别人一定不是celebrity
- 如果candidate不是celebrity,那那个别人也一定不是celebrity,否则会被认出
- 一旦candidate知道了别人,立刻把潜在的candidate换成这个人,因为原来的candidate已经不符合题意了
只要有celebrity的存在,则他一定就是就是candidate,但是celebrity也可能不存在,所以我们要做二次验证。
- 时间复杂度:
- 空间复杂度:
最终代码如下:
/* 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 candidate = 0;for (int i = 1; i < n; ++i) {if (knows(candidate, i)) {// update candidatecandidate = i;}}for (int i = 0; i < n; ++i) {if (candidate == i) {continue;}if (knows(candidate, i) || !knows(i, candidate)) {return -1;}}return candidate;}}
