1. 程式人生 > >LintCode-662. 猜數遊戲(C++)

LintCode-662. 猜數遊戲(C++)

題目描述:

我們正在玩猜數遊戲。 遊戲如下:
我從 1 到 n 選擇一個數字。 你需要猜我選擇了哪個號碼。
每次你猜錯了,我會告訴你這個數字是高還是低。
你呼叫一個預定義的介面 guess(int num),它會返回 3 個可能的結果(-1,1或0):

原始程式碼:

// 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: /** * @param n an integer * @return the number you guess */ int guessNumber(int n) { // Write your code here } };

分析:

這道題其實可以看成一個查詢演算法(查詢那個你要猜的數)。在這裡我用的折半查詢(平均時間複雜度為O(log2n)

  • 第一次嘗試:
// 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: /** * @param n an integer * @return the number you guess */ int guessNumber(int n) { // Write your code here int low = 1, high = n; while
(low < high) { int mid = (low + high) / 2; int r = guess(mid); if(r == 1) { low = mid + 1; } else if(r == -1) { high = mid - 1; } else { return mid; } } } };

執行之後顯示錯誤Time Limit Exceeded,然後顯示的測試資料是2147483647,而這個數就是int型資料能儲存的最大的數。這是因為low + high會出現超出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:
    /**
     * @param n an integer
     * @return the number you guess
     */
    int guessNumber(int n) {
        // Write your code here
        int low = 1, high = n;
        while (low < high) {
            int mid = low + (high - low)/2; //這樣就OK了!
            int r = guess(mid);
            if(r == 1) {
                low = mid + 1;
            } else if(r == -1) {
                high = mid - 1;
            } else {
                return mid;
            }
        }
    }
};