题目是这样子的.
We are playing the Guess Game. The game is as follows:
I pick a number from 1 to n. You have to guess which number I picked.
Every time you guess wrong, I'll tell you whether the number is higher or lower.
You call a pre-defined API guess(int num)
which returns 3 possible results (-1
, 1
,
or 0
):
这题用的主要是二分查找,主要思路是用两个参数表示边界,查找中心点比较后重新定边界,直到找到为止
边界的定义
int l =1 ; //左边界
int r =n ; // 右边界
int mid = (r-l)/2 + l ; // 中心点,等价于(r+l)/2,为了防止溢出
然后用guess(mid)进行判断,如果返回0,则结果找到返回mid;返回-1,则猜的数比选的数大,右边界设为mid-1;返回1,则猜的数比选的数小,左边界设为mid+1。然后再重新设置中心点,直到找到为止(该题不存在找不到的情况)完整代码:
// Forward declaration of guess API.
// @param num, your guess
// @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
int guess(int num);
class Solution {
public:
int guessNumber(int n) {
int l = 1;
int r = n;
int mid;
int result;
while(l<=r)
{
mid = (r-l)/2+l;
result = guess(mid);
if(result == -1)
{
r = mid -1;
}
else if(res == 1)
{
l = mid + 1;
}
else
{
return mid;
}
}
return 0;
}
};