码迷,mamicode.com
首页 > 编程语言 > 详细

【简单算法】32.第一个错误的版本

时间:2018-05-03 22:42:38      阅读:426      评论:0      收藏:0      [点我收藏+]

标签:二分   解题思路   版本   需要   forward   次数   for   查找   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.第一个错误的版本

标签:二分   解题思路   版本   需要   forward   次数   for   查找   size   

原文地址:https://www.cnblogs.com/mikemeng/p/8987901.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!