题目
大致思路
- 用类似二分法进行查找即可,注意区分出现的两种情况
已知前面全是right版本 后面全是false版本,根据他们的分界点进行区分,分界点在中点左,中点右进行区分。
代码实现
/* The isBadVersion API is defined in the parent class VersionControl.
boolean isBadVersion(int version); */
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
if (isBadVersion(1))
return 1;
// 设置左右指针和他们的动态中点。
int left = 1;
int right = n;
int middle;
while (left < right) {
// 计算当前中点
middle = left / 2 + right / 2;
//middle = (left + right )/2;这里不能写为和/2,和的话会超出时间限制,必须单独分开写。
// 如果当前中点为错误版本,则应从这之前的版本找,因此把右指针指到此处,否则,左指针指到此处+1的位置。
if (isBadVersion(middle))
right = middle;
else
left = middle + 1;
}
// 当左右相同时,即找到了那个第一个错误的版本。
return left;
}
}