LintCode-662. 猜數遊戲(C++)
阿新 • • 發佈:2019-01-24
題目描述:
我們正在玩猜數遊戲。 遊戲如下:
我從 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;
}
}
}
};