
出错经历
第一个版本代码;
/* 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;}}
