一、題目名稱java
First Bad Version(第一個壞版本)函數
二、題目地址code
https://leetcode.com/problems/first-bad-version/leetcode
三、題目內容開發
英文:get
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.it
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.io
中文:function
假設你是一個領導團隊開發新產品的項目經理,如今產品的最新版本沒有經過質量檢查,每一個版本都是基於上一個版本開發的,若是有一個版本是壞版本,那麼該版本後面的版本也是壞版本。假設如今你的產品有n個版本(從1到n),你如今須要找出第一個壞版本的位置,這個版本是致使後面版本都是壞版本的元兇。
題目中提供了一個返回值爲布爾型的API函數isBadVersion,這個函數會返回某個版本號對應的版本是不是壞版本。寫一個函數找出第一個壞版本,你須要將你調用API函數的次數降到最低。
四、解題方法
因爲版本號是從1開始,一直到n,屬於增序排列,所以能夠採用二分查找的策略,減小比較次數。須要注意的是,在取二分查找的中間值時,不要使用左右相加後再除以2的方式,這樣可能會在計算時產生溢出。
一段實現此方法的Java代碼以下:
/** * 功能說明:LeetCode 278 - First Bad Version * 開發人員:Tsybius2014 * 開發時間:2015年9月13日 */ public class Solution extends VersionControl { /** * 找到第一個壞版本 * @param n 總版本數 * @return 第一個壞版本的序號 */ public int firstBadVersion(int n) { if (n <= 0) { return 0; } if (isBadVersion(1)) { return 1; } else if (!isBadVersion(n)) { return Integer.MAX_VALUE; } int left = 1; int right = n; int mid; while (true) { mid = left + (right - left) / 2; //注意 left + right 有可能超過了整數的最大值 if (mid == left) { return right; } if (isBadVersion(mid)) { right = mid; } else { left = mid; } } } }
END