leetcode鏈結
你是產品經理,目前正在帶領乙個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。
假設你有n
個版本[1, 2, ..., n]
,你想找出導致之後所有版本出錯的第乙個錯誤的版本。
你可以通過呼叫bool isbadversion(version)
介面來判斷版本號version
是否在單元測試中出錯。實現乙個函式來查詢第乙個錯誤的版本。你應該儘量減少對呼叫 api 的次數。
示例:
給定 n = 5,並且 version = 4 是第乙個錯誤的版本。呼叫 isbadversion(3) -> false
呼叫 isbadversion(5) -> true
呼叫 isbadversion(4) -> true
所以,4 是第乙個錯誤的版本。
思路:一眼望過去,管它三七二十一,先來個暴破再說?
public int firstbadversion(int n)
}return n;
}
不用想,肯定超時了。leetcode上的簡單題,一般都不需要怎麼想,主要是考察細心程度,情況有沒有考慮全而已。接下來用遞迴實現二分的
public int firstbadversion(int n)
public int firstbadversion(int lo, int hi)
int mid = (hi - lo) / 2 + lo; //這裡是為了防止int溢位
if (isbadversion(mid)) else
}
其實很是需要細心一點的,兩數相加要考慮溢位的情況,這裡可以使用(hi - lo ) / 2 + lo計算平均值,而不是直接使用(hi + lo) / 2計算。
另外,在遞迴結束條件和遞迴傳參方法上也可以進行小改動。(如果傳的時mid - 1,那麼迴圈結束的條件必須是lo > hi而不能包括等於的情況)
public int firstbadversion(int n)
public int firstbadversion(int lo, int hi)
int mid = (hi - lo) / 2 + lo;
if (isbadversion(mid)) else
}
根據遞迴也可以很快的寫出迭代的實現方法
public int firstbadversion(int n)
return lo;
}
總結一下,這道題值得注意的點在於邊界值的處理還有兩數相加溢位的情況。 第乙個錯誤的版本
你是產品經理,目前正在帶領乙個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。假設你有 n 個版本 1,2,n 你想找出導致之後所有版本出錯的第乙個錯誤的版本。你可以通過呼叫 bool isbadversio...
第乙個錯誤的版本
你是產品經理,目前正在帶領乙個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。假設你有 n 個版本 1,2,n 你想找出導致之後所有版本出錯的第乙個錯誤的版本。你可以通過呼叫 bool isbadversio...
第乙個錯誤的版本
你是產品經理,目前正在帶領乙個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。假設你有 n 個版本 1,2,n 你想找出導致之後所有版本出錯的第乙個錯誤的版本。你可以通過呼叫 bool isbadversio...