1. 程式人生 > >二分查詢 ----- Leetcode-374. 猜數字大小

二分查詢 ----- Leetcode-374. 猜數字大小

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

-1 : 我的數字比較小
 1 : 我的數字比較大
 0 : 恭喜!你猜對了!

示例 :

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

------------------------------------------------------------------------------------------------------------------------------------------------------------

首先是一個二分查詢,如果使用下面的演算法,會編譯通過:


public class Solution extends GuessGame {
    public int guessNumber(int n) {
        int left = 1;
        int right = n;
        int mid = 0;
        while(left<=right){
            mid = left + (right-left)/2;
            if(guess(mid)==0) return mid;
            else if(guess(mid)==1) left = mid+1;
            else if(guess(mid)==-1) right = mid-1;
        }
        return mid;
        
    }
}

------------------------------------------------------------------------------------------------------------------------------------------------------------

但是如果使用下面的程式碼,會超時:

/* The guess API is defined in the parent class GuessGame.
   @param num, your guess
   @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
      int guess(int num); */

//解釋下:guess介面可以直接使用,num是你要猜的數字,這個函式就是告訴你,你猜的和真實的比較結果

public class Solution extends GuessGame {
    public int guessNumber(int n) {
        int left = 1;
        int right = n;
        int mid = 0;
        while(left<=right){
            mid = (right+left)/2;
            if(guess(mid)==0) return mid;
            else if(guess(mid)==1) left = mid+1;
            else if(guess(mid)==-1) right = mid-1;
        }
        return mid;
        
    }
}

------------------------------------------------------------------------------------------------------------------------------------------------------------

問題就是出在 mid = left + (right-left)/2;這裡,但是我還是不明白為什麼使用mid = (left + right)/2;不可以。

會超時。因為這兩句的運算結果是一樣的。而且影響效率的為什麼不是遞迴呼叫guess函式那裡?

有知道原因的朋友請告知,謝謝!

------------------------------------------------------------------------------------------------------------------------------------------------------------