这道题是一道Graph题目,关于这种人际关系网,谁认识不认识谁的题目,用indegree,outdegree是没问题的,时间复杂度是O(n2):

/* The knows API is defined in the parent class Relation.
      boolean knows(int a, int b); */

public class Solution extends Relation {
    int[] indegree;
    int[] outdegree;
    public int findCelebrity(int n) {
        indegree = new int[n];
        outdegree = new int[n];
        for(int i = 0;i<n;i++){
            for(int j=0;j<n;j++){
                if(i!=j&&knows(i,j)){
                    indegree[j]++;
                    outdegree[i]++;
                }
            }
        }
        for(int i=0;i<n;i++){
            if(indegree[i]==n-1 && outdegree[i]==0)
                return i;
        }
        return -1;
    }
}

因为这道题是要寻找一个特殊的人,也就是Celebrity,他/她不认识任何人,但是大家都认识他/她。那么对于这种名人,其实可以用two pass来筛选,时间复杂度O(n):

1. 找到大家都认识的candidate,或者不认识别人的candidate。

2. 进一步筛选,如果这candidate即不认识每个人,而每个人又都认识他/她,那答案就是他/她了。

3. 如果步骤2的candidate不符合条件,那么返回-1.

    public int findCelebrity(int n) {
        int candi = 0;
         for(int i=0;i<n;i++){
             if(!knows(i, candi)){
                 candi = i;
             }
         }
/*
        for (int i = 0; i < n; i++) {
            if (knows(candi, i))
                candi = i;
        }
*/
        for (int i = 0; i < n; i++) {
            if (i == candi)
                continue;
            if (knows(candi, i) || !knows(i, candi))
                return -1;
        }
        return candi;
    }

 

posted on 2022-01-25 03:22  阳光明媚的菲越  阅读(25)  评论(0编辑  收藏  举报