1. 程式人生 > >Leetcode:278.第一個報錯的版本

Leetcode:278.第一個報錯的版本

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

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

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

示例:

給定 n = 5,並且 version = 4 是第一個錯誤的版本。

呼叫 isBadVersion(3) -> false
呼叫 isBadVersion(5) -> true
呼叫 isBadVersion(4) -> true

所以,4 是第一個錯誤的版本。 

解題思路:

二分查詢。本題並不難,簡單的二分查詢。二分查詢之中就難免遇到(left+right)/2,注意一般而言都是陣列下標,然而這次確實產品號,因此要注意兩個int 相加可能溢位,因此用long 代替,防止溢位。

long ,int 的差別:

作業系統   int(位數)   long(位數)

16位                2位元組16位        4位元組32位

32位               4位元組32位         4位元組32位

64位               4位元組32位         8位元組64位

C++程式碼

bool isBadVersion(int version);

class Solution {
public:
    int firstBadVersion(int n) {
        long left=1,right=n;
        while(left<=right){
            long mid=(left+right)/2;
            bool bl=isBadVersion(left);
            bool br=isBadVersion(right);
            bool bm = isBadVersion(mid);
            if(bl == true) return bl;
            if(left == right) return left;
            if(left == right-1) return (bl?left:right);
            if(bm) right=mid;
            else left=mid;
        }
    }
};