题目链接: https://leetcode.com/problems/guess-number-higher-or-lower/
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
):
-1 : My number is lower 1 : My number is higher 0 : Congrats! You got it!
Example:
n = 10, I pick 6. Return 6.
解题思路:把题目看懂后就知道是用二分法查找,但是需要考虑到上下边界问题。
代码:
1. 同时考虑上下边界:
<span style="white-space:pre"> </span>int start = 1;
int end = n;
int mid = end - (end - start)/2;
int tmp = guess(mid);
while(tmp!=0){
if(tmp == 1){
start = mid;
mid = end - (end - start)/2;
}else{
end = mid;
mid = start + (end - start)/2;
}
tmp = guess(mid);
}
return mid;
这里的 mid = end - (end - start)/2 考虑上边界,mid = start + (end - start)/2 考虑下边界。
2. 也可以将上边界或者下边界固定:
<span style="font-size:18px;"> <span style="white-space:pre"> </span>if(guess(1) == 0) return 1;
int start = 1;
int end = n;
int mid = end - (end - start)/2;
int tmp = guess(mid);
while(tmp!=0){
if(tmp == 1){
start = mid;
}else{
end = mid;
}
mid = end - (end - start)/2;
tmp = guess(mid);
}
return mid;</span>
或者
<span style="font-size:18px;"> <span style="white-space:pre"> </span>if(guess(n) == 0) return n;
int start = 1;
int end = n;
int mid = start + (end - start)/2;
int tmp = guess(mid);
while(tmp!=0){
if(tmp == 1){
start = mid;
}else{
end = mid;
}
mid = start + (end - start)/2;
tmp = guess(mid);
}
return mid;</span>
注意点:
1. 不可以表示为 mid = (start + end)/2, 否则start+end值过大会导致int溢出。
2. 也不可以表示为 mid = start/2 + end/2,因为当start = end = 1时,mid 会变为0。