二分查詢 ----- Leetcode-374. 猜數字大小
我們正在玩一個猜數字遊戲。 遊戲規則如下:
我從 1 到 n 選擇一個數字。 你需要猜我選擇了哪個數字。
每次你猜錯了,我會告訴你這個數字是大了還是小了。
你呼叫一個預先定義好的介面 guess(int num)
,它會返回 3 個可能的結果(-1
,1
或 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函式那裡?
有知道原因的朋友請告知,謝謝!
------------------------------------------------------------------------------------------------------------------------------------------------------------