猜數字大小
題目描述:猜數字遊戲的規則如下:
- 每輪遊戲,我都會從 1 到 n 隨機選擇一個數字。 請你猜選出的是哪個數字。
- 如果你猜錯了,我會告訴你,你猜測的數字比我選出的數字是大了還是小了。
你可以通過呼叫一個預先定義好的介面 int guess(int num) 來獲取猜測結果,返回值一共有 3 種可能的情況(-1,1 或 0):
- -1:我選出的數字比你猜的數字小 pick < num
- 1:我選出的數字比你猜的數字大 pick > num
- 0:我選出的數字和你猜的數字一樣。恭喜!你猜對了!pick == num
返回我選出的數字。
示例說明請見LeetCode官網。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法一:二分查詢法
典型的二分查詢問題,首先low初始值為1,high初始值為num,二分查詢過程如下:
- 迴圈的前提是low不大於high;
- 然後mid的值為
low + (high - low) / 2
,然後呼叫guess(num)
方法進行判斷;- 如果返回-1,則high的值置為
mid - 1
,然後進行下一輪處理;- 如果返回1,則low的值置為
mid + 1
,然後進行下一輪處理;- 如果返回0,則返回mid值,該值即為選出的數字。
public class LeetCode_374 extends GuessGame {
/**
* 二分查詢
*
* @param num
* @return
*/
public static int guessNumber(int num) {
int low = 1, high = num;
while (low <= high) {
int mid = low + (high - low) / 2;
if (guess(mid) == -1) {
high = mid - 1;
} else if (guess(mid) == 0) {
return mid;
} else if (guess(mid) == 1) {
low = mid + 1;
}
}
return -1;
}
public static void main(String[] args) {
System.out.println(guessNumber(2126753390));
}
}
class GuessGame {
/**
* 假設1702766719是最終的結果
* Forward declaration of guess API.
*
* @param num your guess
* @return -1 if num is lower than the guess number
* 1 if num is higher than the guess number
* otherwise return 0
*/
public static int guess(int num) {
if (num > 1702766719) {
return -1;
} else if (num == 1702766719) {
return 0;
} else {
return 1;
}
}
}
【每日寄語】 總之歲月漫長,然而值得等待。