这道题是一道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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了