题目
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
思路
其实这题,一开始我没看明白它在说啥,这个判断对错,到底是谁来判断的。为什么传入个n,然后就让我们返回结果。但是后面看到类继承了VersionControl类,而VersionControl类里面又有个判断的方法,就大概明白,要我们找出哪个位置的数。那就用二分就好了!
题目里面要求,要尽量少调用API的次数!
代码
/* The isBadVersion API is defined in the parent class VersionControl.
boolean isBadVersion(int version); */
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
int l=1;
int r=n;
int mid=0;
while(l<r)
{
mid=l+((r-l)>>1); // 这里写,就为了防止二分溢出
if(isBadVersion(mid)) //假设为ture,即mid已经出现了错误,出现错误的版本在l和mid之间
{
r=mid;
}
else
{
l=mid+1;
}
}
return l;
}
}
结果
为了防止溢出的问题,所以,去中间值的时候要使用mid=l+((r-l)>>1),而且还有个问题,LeetCode里面,mid=l+(r-l)>>1的执行结果是与上面的计算结果不一致的!