第一個錯誤的版本
題目描述:你是產品經理,目前正在帶領一個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。
假設你有 n 個版本 [1, 2, ..., n],你想找出導致之後所有版本出錯的第一個錯誤的版本。
你可以通過呼叫 bool isBadVersion(version) 介面來判斷版本號 version 是否在單元測試中出錯。實現一個函式來查詢第一個錯誤的版本。你應該儘量減少對呼叫 API 的次數。
示例說明請見LeetCode官網。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法一:二分法
分別用low和high記錄第一個元素和最後一個元素,然後用二分法求解,求解過程如下:
- 用mid記錄中間位置,即
low + (high - low) / 2
,然後呼叫isBadVersion(mid)
方法判斷當前版本是否是錯誤版本;- 如果當前版本是錯誤版本且當前版本前面的一個版本(需要再次呼叫
isBadVersion
方法)也是錯誤版本,則將high重置為mid-1
,然後進行下一輪處理;- 如果當前版本是錯誤版本但是當前版本的前面一個版本不是錯誤版本,則當前版本即是第一個錯誤版本,返回當前版本;
- 如果當前版本不是錯誤版本,則將low重置為
mid+1
,然後進行下一輪處理。- 迴圈終結的條件就是low大於high。
最後,如果沒有找到錯誤的版本,返回-1。
public class LeetCode_278 extends VersionControl {
/**
* 二分法
*
* @param n
* @return
*/
public static int firstBadVersion(int n) {
int low = 1, high = n;
while (low <= high) {
int mid = low + (high - low) / 2;
if (isBadVersion(mid)) {
if (mid > low && isBadVersion(mid - 1)) {
high = mid - 1;
} else {
return mid;
}
} else {
low = mid + 1;
}
}
return -1;
}
public static void main(String[] args) {
System.out.println(firstBadVersion(2126753390));
}
}
class VersionControl {
/**
* 測試資料,前1702766718個版本都不是錯誤版本,從第1702766719個版本開始都是錯誤版本
*/
public static boolean isBadVersion(int version) {
if (version < 1702766719) {
return false;
} else {
return true;
}
}
}
【每日寄語】 如果成功有捷徑,那條路一定是堅持。