fucking-algorithm
fucking-algorithm copied to clipboard
众里寻他千百度:名流问题 :: labuladong的算法小抄
打卡打卡
第一次便利可以只调用一次 knows ,不需要调用两次:
public int findCelebrity(int n) {
int curr = 0;
for(int i = 1; i<n; i++) if(knows(curr, i)) curr = i;
for(int i=0;i<n;i++)
if(i!=curr&&(knows(curr,i)||!knows(i,curr))) return -1;
return curr;
}
暴力求解法是不是有点问题,最后一个判断,我怎么跑的不对,感觉应当放到第二层循环里面
暴力解法每次拿到know(candidate, other)却只用来判断candiate是否满足一定条件,以后还会在判断other的合法性时再次多触发一次,理论效率至少低一倍。 这类算法优化点在于充分理解名人的定义,运用排除法大幅度减少需要查询的范围,与快排/二分法等优化算法异曲同工,🐂🍺
关于文中笔误的问题
在第一幅图 与 第二幅图中间的一段表述中 , 误将 邻接矩阵
写成了 邻接表
对于名人问题,显然会经常需要判断两个人之间是否认识,也就是两个节点是否相邻,所以我们可以用邻接表来表示人和人之间的社交关系。
@zhongweiLeex 感谢指出,已修复~
两人互不认识,都不是名人。只排除一个人而不是两个人,是为了让代码更具有统一性吧。
check in
暴力解法中
for (int cand = 0; cand < n; cand++) { int other; for (other = 0; other < n; other++) {
other 如何都会小于n 啊 怎么会满足判断条件 if (other == n) 的 ?