leetcode 374

这个题目很简单,但是要注意细节和对题目的理解,一开始我把guess函数的作用理解错了,第一版代码长这样:

 1 int guessNumber(int n)
 2 {
 3     int low = 1;
 4     int high = n;
 5 
 6     while(low < high)
 7     {
 8         int mid = (high + low) / 2;
 9         int g = guess(mid);
10         if(g == 0)
11             return mid;
12         else if(g > 0)
13             low = mid + 1;
14         else
15             high = mid - 1;
16     }
17 
18     return low;
19 
20 }

在重新读了几次题目之后,第二版代码长这样:

 1 int guessNumber(int n)
 2 {
 3     int low = 1;
 4     int high = n;
 5 
 6     while(low < high)
 7     {
 8         int mid = (high + low) / 2;
 9         int g = guess(mid);
10         if(g == 0)
11             return mid;
12         else if(g < 0)
13             low = mid + 1;
14         else
15             high = mid - 1;
16     }
17 
18     return low;
19 
20 }

但是还是不能正确通过,这很尴尬:查了半天发现是上面标注的那段代码有问题,我一直以为把代码写成最简单的数学表达式是一个好选择,但是这里显然不是这样:因为这样当high和low都比较大时,这是会导致溢出!所以有了第三个版本的代码:

int guessNumber(int n)
{
    int low = 1;
    int high = n;

    while(low < high)
    {
        int mid = low + (high - low) / 2;
        int g = guess(mid);
        if(g == 0)
            return mid;
        else if(g < 0)
            low = mid + 1;
        else
            high = mid - 1;
    }
    return low;
}
原文地址:https://www.cnblogs.com/maizi-1993/p/5884589.html