标签:candidate 认识 int indegree Celebrity outdegree public k2 Find
这道题是一道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; }
标签:candidate,认识,int,indegree,Celebrity,outdegree,public,k2,Find 来源: https://www.cnblogs.com/feiflytech/p/15841596.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。