建議直接看文末的二分查詢
題目的意思很簡單,乙個陣列中前面都是0,後面都是1,你可以通過 isbadversion(int version) 函式來判斷version位置處的元素是1還是0。並強調了要盡可能地少呼叫該函式。那麼很顯然就是要二分查詢了。但是我開始寫的二分查詢竟然在第11組測試用例就超時了(原因見文末),後來一直也沒有找出來錯來,自暴自棄地寫了乙個線性查詢竟然撐到了第16組測試用例才tle。於是我改良了線性查詢,先縮小查詢的範圍,然後在乙個小範圍中線性查詢,這個詭異的想法竟然通過了,**如下
int firstbadversion(int n)
耗時相當多。我企圖通過每次變化的幅度來優化時間效率。下面的**執行用時為0ms
仔細思考之後發現,由於c語言整除時向下取整的特點,只有在n很大的時候, 他才會大概按照每次1/10000的比例縮減,而n不夠大的時候,基本上是按照每次接近10000速度減少,因為在第一次除法進行完之後,n的後四位數肯定會變得比較大,比如152563/10000=15
15*9999=149985
這也好理解,因為乙個數乘以一萬肯定會得到乙個後四位都為零的數,而在這裡乘以的是9999,後四位肯定略小於10000
就算蒙混過關吧,不推薦
int firstbadversion(int n)
但是這種奇技淫巧畢竟不具有普遍性,下面是乙個通過且用時0ms的二分查詢
int firstbadversion(int n) {
if(isbadversion(1)) return 1;
int l=1,r=n;
int mid;
while(l注意其中的mid=l/2+r/2
而不是(l+r)/2,因為後者在l+r較大時會溢位,然後就開始了亂七八糟的迴圈......
第一篇部落格,就這樣吧~
Leetcode 278 第乙個錯誤版本
你是產品經理,目前正在帶領乙個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。假設你有 n 個版本 1,2,n 你想找出導致之後所有版本出錯的第乙個錯誤的版本。你可以通過呼叫 bool isbadversio...
LeetCode 278 第乙個錯誤的版本
你是產品經理,目前正在領導乙個團隊開發乙個新產品。不幸的是,您的產品的最新版本沒有通過質量檢查。由於每個版本都是基於之前的版本開發的,所以錯誤版本之後的所有版本都是不好的。假設你有n個版本 1,2,n 你想找出第乙個錯誤的版本,導致下面所有的錯誤。你可以通過bool isbadversion ver...
LeetCode 278 第乙個錯誤的版本
題目鏈結 題目描述 你是產品經理,目前正在帶領乙個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。假設你有 n 個版本 1,2,n 你想找出導致之後所有版本出錯的第乙個錯誤的版本。你可以通過呼叫 bool i...