随笔 - 164,  文章 - 0,  评论 - 0,  阅读 - 4104

这道题是一道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   阳光明媚的菲越  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示