1. 程式人生 > >LeetCode演算法題-Guess Number Higher or Lower(Java實現)

LeetCode演算法題-Guess Number Higher or Lower(Java實現)

這是悅樂書的第211次更新,第224篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第79題(順位題號是374)。我們正在玩數字遊戲。 遊戲如下:我從1到n中選擇一個數字。 你必須猜測我選擇了哪個數字。每次你猜錯了,我都會告訴你這個數字是高還是低。您呼叫預定義的API guess(int num),它返回3個可能的結果(-1,1或0):

-1:我的數字較低
1:我的數字更高
0:猜對了!

例如:

輸入:n = 10,pick = 6
輸出:6

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

暴力解法,直接使用for迴圈,依次呼叫guess(int num)方法,直到猜對了為止。但是此解法超時。

此解法時間複雜度是O(n),空間複雜度是O(1)。

public int guessNumber(int n) {
    for (int i=1; i<n; i++) {
        if (guess(i) == 0) {
            return i;
        }
    }
    return n;
}

03 第二種解法

使用二分查詢法來判斷,在求中間數的時候,需要換種寫法mid = (high-low)/2 + low;或者將型別換成long,這樣做是為了避免溢位。

此解法的時間複雜度是O(log n),空間複雜度是O(1)。

public int guessNumber2(int n) {
    int low = 1;
    int high = n;
    while (low <= high) {
        int mid = (high-low)/2 + low;
        int result = guess(mid);
        if (result == 0) {
            return mid;
        } else if(result == 1) {
            low = mid + 1;
        } else if(result == -1) {
            high = mid - 1;
        }
    }
    return -1;
}

04 小結

演算法專題目前已連續日更超過兩個月,演算法題文章79+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!