题目链接
代码
法一 暴力枚举超时
/**
* Forward declaration of guess API.
* @param num your guess
* @return -1 if num is lower than the guess number
* 1 if num is higher than the guess number
* otherwise return 0
* int guess(int num);
*/
int guessNumber(int n){
for(int i = 1; i <= n; ++i) {
if (guess(i) == 0)
return i;
}
return 0;
}
法二 二分查找
/**
* Forward declaration of guess API.
* @param num your guess
* @return -1 if num is lower than the guess number
* 1 if num is higher than the guess number
* otherwise return 0
* int guess(int num);
*/
int guessNumber(int n){
long low = 0, high = n; // 1
int mid = n / 2;
while (guess(mid) != 0) {
if (guess(mid) == -1) { // 2
high = mid - 1;
} else {
low = mid + 1;
}
mid = (low + high) / 2;
}
return mid;
}
- low 和 high若声明为 int 型,当low + high超出最大 int 范围会报错,所以声明为long型
- guess(mid)返回-1,说明答案比mid小,所以应从[low,mid-1]再次取中猜测