出错经历
第一个版本代码;
/* 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 low = 1,high = n;
while (low < high) { // 循环直至区间左右端点相同
int mid = (low + high) / 2;
if (isBadVersion(mid)) {
--high;
}
else{
++low;
}
}
return low;
}
}
结果说超时,因为输入是2126753390 1702766719
然后发现,不需要++—,因为是一段好,一段坏,我们要找那个分界点,官方的话就是缩紧一次边界
解与关于我二分法的反思(很关键)
….我突然发现了我的问题可恶(两个问题)
问题1: left + right 容易溢出 left + (right - left) / 2就不会了 (8 + 9) / 2 8 + (9 - 8) / 2 区别还是很大的
问题2:我之前的时候因为数据小所以用的是—high,++low这样,可是**他直接变成mid就好了啊,我前几个二分法写的有什么大毛病!…之后注意
亏我还说我数据结构学的还行,翻车….
正确代码
/* 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 low = 1,high = n;
while (low < high) { // 循环直至区间左右端点相同
int mid = low + (high - low) / 2;
if (isBadVersion(mid)) {
high=mid;
}
else{
low=mid+1;
}
}
return low;
}
}