1.png

出错经历

第一个版本代码;

  1. /* The isBadVersion API is defined in the parent class VersionControl.
  2. boolean isBadVersion(int version); */
  3. public class Solution extends VersionControl {
  4. public int firstBadVersion(int n) {
  5. int low = 1,high = n;
  6. while (low < high) { // 循环直至区间左右端点相同
  7. int mid = (low + high) / 2;
  8. if (isBadVersion(mid)) {
  9. --high;
  10. }
  11. else{
  12. ++low;
  13. }
  14. }
  15. return low;
  16. }
  17. }

结果说超时,因为输入是2126753390 1702766719

然后发现,不需要++—,因为是一段好,一段坏,我们要找那个分界,官方的话就是缩紧一次边界

解与关于我二分法的反思(很关键)

….我突然发现了我的问题可恶(两个问题)

问题1: left + right 容易溢出 left + (right - left) / 2就不会了 (8 + 9) / 2 8 + (9 - 8) / 2 区别还是很大的

问题2:我之前的时候因为数据小所以用的是—high,++low这样,可是**他直接变成mid就好了啊,我前几个二分法写的有什么大毛病!…之后注意

亏我还说我数据结构学的还行,翻车….

正确代码

  1. /* The isBadVersion API is defined in the parent class VersionControl.
  2. boolean isBadVersion(int version); */
  3. public class Solution extends VersionControl {
  4. public int firstBadVersion(int n) {
  5. int low = 1,high = n;
  6. while (low < high) { // 循环直至区间左右端点相同
  7. int mid = low + (high - low) / 2;
  8. if (isBadVersion(mid)) {
  9. high=mid;
  10. }
  11. else{
  12. low=mid+1;
  13. }
  14. }
  15. return low;
  16. }
  17. }