题目要求:猜数字,如果猜对了guess函数会返回0,如果没有猜对guess函数会告诉你猜大了还是猜小了。直到你猜出这个数并返回。
解题方法:典型的二分查找。
有一个点需要注意:取中间数的时候一定要这么取: int g=l+(h-l)/2; 因为如果写成 int g=(l+h)/2;会因为(l+h)计算值太大了超过了int的表达范围产生溢出。
两个程序原理是一样的,写法不一样:
// 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 h=n;
int g=l+(h-l)/2;
while(guess(g)!=0){
if(guess(g)==1){
l=g+1;
g=l+(h-l)/2;
}
else{
h=g-1;
g=l+(h-l)/2;
}
}
return g;
}
};
// 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 h=n;
int g;
while(l<h){
g=l+(h-l)/2;
if(guess(g)==0) return g;
else if(guess(g)==1) l=g+1;
else h=g-1;
}
return l;
}
};