题目描述:
现有从n个版本产品,由于第x个版本发生错误,导致x版本以及之后的所有版本都发生错误。请找出x版本的位置
解法:
比较明显的二分解题方法,二分查找即可。
但是,在确定中间位置时,请使用:
int middle = start + (end - start)/2; (1)
而不是
int middle = (start + end)/2; (2)
公式(1)和公式(2)在一般情况下结果相同,但是当start+end已经足够大且超过int型最大表示范围时,会发生越界错误,从而导致不可知的运行结果以及时间。
解题代码如下:
/* 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 start = 1;
int end = n;
while(start <= (end - 2))
{
int middle = start + (end - start)/2;
if(true == isBadVersion(middle))
{
end = middle;
}
else
{
start = middle;
}
}
if(true == isBadVersion(start))
{
return start;
}
else
{
return end;
}
}
}