名人的定义:他不认识任何人,任何人都认识他 (最多有一个名人)
和众数问题的框架很像,都是维护一个candidate,然后扫一遍,不断排除,最后的唯一的可能性就是candidate,验证这个candidate
1)取第一个做为candidate
2) 遍历剩余的人,如果 candidate knows i, 排除当前candidate,换成i;否则排除i, candidate不变
3)不变式:已经考察过的人,要么被排除是名人的可能性,要么在candidate里
4)循环结束时,只有剩下的candidate没有确定,单独验证之。
bool knows(int a, int b);
int celebrity(int n) {
int x = 0;
for (int i = 1; i < n; ++i) {
if (knows(x, i)) x = i;
}
for (int i = 0; i < n; ++i) {
if (i != x && knows(x, i) || !knows(i, x)) return -1;
}
return x;
}

本文介绍了一种寻找名人的算法实现方法,通过遍历候选者并逐步排除非名人选项,最终确定唯一可能的名人。该算法利用了名人定义的特性,并通过两次遍历来确保结果的有效性。
1045

被折叠的 条评论
为什么被折叠?



