LeetCode-374-猜數字大小

雄獅虎豹發表於2021-10-04

猜數字大小

題目描述:猜數字遊戲的規則如下:

  • 每輪遊戲,我都會從 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;
        }
    }
}
【每日寄語】 總之歲月漫長,然而值得等待。

相關文章