277 find the celebrity
https://leetcode.com/problems/find-the-celebrity/
/* The knows API is defined in the parent class Relation.
boolean knows(int a, int b); */
public class Solution extends Relation {
public int findCelebrity(int n) {
int left = 0;
int right = n - 1;
// 这里不像二分查找,left最后是可能end up等于right的,因为他们可能同时移动
while (left + 1 < right) {
boolean ab = knows(left, right);
boolean ba = knows(right, left);
if (ab && ba) {
left++;
right--;
} else if (ab) {
left++;
} else {
right--;
}
}
boolean ab = knows(left, right);
boolean ba = knows(right, left);
if (ab || ba) {
int idx = ab ? right : left;
for (int i = 0; i < n; i++) {
if (i == idx) {
continue;
}
if (!knows(i, idx) || knows(idx, i)) {
return -1;
}
}
return idx;
}
return -1;
}
}
这都能二分查找我是没想到的,但是最后还是要验证
Last updated