1. 程式人生 > >【簡單算法】32.第一個錯誤的版本

【簡單算法】32.第一個錯誤的版本

查找 好的 有意思 HA for vector size 新版本 之前

題目:

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

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

你可以通過 bool isBadVersion(version) 的接口來判斷版本號 version 是否在單元測試中出錯。實現一個函數來查找第一個錯誤的版本。您應該盡量減少對 API 的調用次數。

貢獻者:
特別感謝 @jianchao.li.fighter 添加此問題並創建所有測試用例。

解題思路:

這道題目比較有意思,從表面上看肯定是用二分查找來計算,但是如何找到第一個錯誤的版本是個難點。用res記錄下每次錯誤的版本。

類似於在一個已經排序好的數組中查找第一個比該數目小但最接近該數的值。此題目作為重點題目變形題目,平時需要多加練習。

代碼如下:

int binarySearch(vector<int> & nums,int target){
        int l = 0;
        int r = nums.size() - 1;
        int res = -1;
        
        while(l <= r){
            
int mid = (l + r)/2; if(nums[mid] == target){ return mid; }else if(nums[mid] > target){ r = mid - 1; }else{ res = mid; l = mid + 1; } } cout<<res<<endl;
return res; }

代碼:

// Forward declaration of isBadVersion API.
bool isBadVersion(int version);

class Solution {
public:
    int firstBadVersion(int n) {
        int res = -1;
        int low = 1;
        int high = n;
        while (low <= high)
        {
            int mid = low + (high - low) / 2;
            if (isBadVersion(mid))
            {
                res = mid;
                high = mid - 1;
            }
            else
            {
                low = mid + 1;
            }
        }
        return res;
    }
};

【簡單算法】32.第一個錯誤的版本