Skip to content

Latest commit

 

History

History
85 lines (67 loc) · 1.45 KB

File metadata and controls

85 lines (67 loc) · 1.45 KB

Question:

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:

Input: n = 10, pick = 6
Output: 6

Analysis

典型的二分法结题思路哈,就不用分析了吧。

Tips

  1. 求中位数禁止用(left + right)/ 2 , 而应该用 left + (right - left) / 2 从而可以避免溢出
  2. 外部调用函数尽量越少用越好

Code

// 解法一
int guess(int num) {
  int n = 31;

  if (num == n)
    return 0;
  else if (num < n)
    return 1;
  else
    return -1;
}

class SolutionGuess {
public:
  int guessNumber(int n) {
    int left = 1, right = n, mid = (1 + n) / 2;

    while(guess(mid) != 0) {
      if (guess(mid) < 0)
        right = mid - 1;
      else
        left = mid + 1;
      mid = (left + right) / 2;
    }
    return mid;
  }
};
// 解法二

int guess(int num);

class Solution {
public:
  int guessNumber(int n) {
    int judge, mid, left = 1, right = n;

    while(true) {
      mid = left + (right - left)/2;
      judge = guess(mid);
      if (judge == 0)
        return mid;
      else if (judge < 0)
        right = mid - 1;
      else
        left = mid + 1;
    }
  }
};