# 【LeetCode】 278. First Bad Version ## Description > You are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version is developed based on the previous version, all the versions after a bad version are also bad. > Suppose you have `n` versions `[1, 2, ..., n]` and you want to find out the first bad one, which causes all the following ones to be bad. > You are given an API `bool isBadVersion(version)` which will return whether version is bad. Implement a function to find the first bad version. You should minimize the number of calls to the API. > 你是一個PM且現在正在領導一個小組去開發一個新的產品。不幸地,你們產品的最新版本沒有通過品質確認。因為每個版本都是基於前一個版本開發,因此所有失敗版本後的版本也都是失敗的。 > 假設你有`n`個版本`[1, 2, ..., n]`且你想找出第一個失敗的版本,因為它造成後面每一個都失敗。 > 你有一個API `bool isBadVersion(version)` 可以回傳版本是否失敗。實作一個函式可以找到第一個失敗的版本。你應該最小化呼叫API的次數。 ## Example: ``` Given n = 5, and version = 4 is the first bad version. call isBadVersion(3) -> false call isBadVersion(5) -> true call isBadVersion(4) -> true Then 4 is the first bad version. ``` ## Solution * 目標是找出API從`false`變成`true`的瞬間,除非第一個版本就是錯誤版本。 * 尋找的方法使用二分搜尋法,每次都檢查中間點是否為切換點: * 如果是切換點(`isBadVersion(mid) != isBadVersion(mid + 1)`),回傳中間點。 * 如果在切換點後(都是`true`),往前面找。 * 如果在切換點前(都是`false`),往後面找。 ### Code ```C++=1 // The API isBadVersion is defined for you. // bool isBadVersion(int version); class Solution { public: int find(int s, int e) { double temp = (double)s + (double)e; int mid = temp / 2; if(isBadVersion(mid) != isBadVersion(mid + 1)) return mid + 1; else if(isBadVersion(mid) == false) return find(s, mid); else return find(mid, e); } int firstBadVersion(int n) { if(isBadVersion(1)) return 1; return find(n, 1); } }; ``` ###### tags: `LeetCode` `C++`