思路
打擂台。每一次名人测试knows(ans,i)可以排除一个人的可能性:knows为真,则ans不是名人;否则i不是名人。首先将0放在擂台ans上,从1开始依次与擂台上的元素进行pk,如果knows为真则ans不是名人,将擂台上的元素换成i;否则i不是名人,擂台上依旧为原来的元素。最后经过n-1次比较,会剩下一个擂台上的元素,对其进行名人测试即可(!knows(ans,i)+knows(i,ans))。
复杂度
时间复杂度O(n), 空间复杂度O(1)
代码
/* The knows API is defined in the parent class Relation.
boolean knows(int a, int b); */
public class Solution extends Relation {
/**
* @param n a party with n people
* @return the celebrity's label or -1
*/
public int findCelebrity(int n) {
// Write your code here
int ans = 0;
for(int i = 1; i < n; i++) {
if(knows(ans, i)) {
ans = i;
}
}
for(int i = 0; i < n; i++) {
if(ans != i && knows(ans, i)) {
return -1;
}
if(ans != i && !knows(i, ans)) {
return -1;
}
}
return ans;
}
}