1. 程式人生 > >LeetCode(初級演算法)排序與搜尋篇---第一個錯誤的版本

LeetCode(初級演算法)排序與搜尋篇---第一個錯誤的版本

第一個錯誤的版本

題目

你是產品經理,目前正在帶領一個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。

假設你有 n 個版本 [1, 2, ..., n],你想找出導致之後所有版本出錯的第一個錯誤的版本。

你可以通過呼叫 bool isBadVersion(version) 介面來判斷版本號 version 是否在單元測試中出錯。實現一個函式來查詢第一個錯誤的版本。你應該儘量減少對呼叫 API 的次數。

示例

給定 n = 5

呼叫 isBadVersion(3) -> false
呼叫 isBadVersion(5) -> true 呼叫 isBadVersion(4) -> true 所以,4 是第一個錯誤的版本。

解析

因為True始終在False的右邊,所以可以使用二分法來解決這個問題。但是要注意的是,這不同於數字的二分查詢,因為在查詢的過程中是無法確定最終的位置,所以需要注意low 與 high 賦值時的情況以及最後的返回值

1) 取中值
f   f   f   f   f   t   t   t   t      (mid=l+(h-l)/2)
l               mid             h

2)h的取值
f   f   t   t   t       (h = mid
-1) l mid h *這裡的h不可以賦予mid-1,因為我們並不清楚mid所處的位置是不是第一個 3) l的取值 f t (l = mid+1) l h mid *因為/2的結果是會向下取整的,如果將l=mid會造成l一直停留在一個位置不變

程式碼


/* The isBadVersion API is defined in the parent class VersionControl.
      boolean isBadVersion(int version); */

public class Solution {
    public
int firstBadVersion(int n) { int l = 1, h = n; //l---低位 h---高位 while (l < h) { int mid = l + (h - l) / 2; //(1) if (isBadVersion(mid)) h = mid; //(2) else l = mid + 1; //(3) } return h; } }