leetcode69题 二分法help see哪错了,为什么打印不出来

leetcode69题 二分法help see哪错了,为什么打印不出来

问题描述:

img

img


public class demoEZ69 {
    public static void main(String[] args) {
        System.out.println(mySqrt(9));
    }

    public static int mySqrt(int x){ // when x == 25
         int l = 0, r = x, ans = -1;
         while(l <= r){ //while (l <= 25)  //4 <= 5
          int mid = 1 + (r-1) /2; // mid == 13  //mid == 6 //mid ==3
          if((long) mid* mid <= x){ //  if((long)169 <= 25)  //if((long)36 <= 25)
              ans = mid; //ans == 9 //ans == 3
              l = mid + 1;// l == 3 + 1 ==4

          }else{
              r = mid -1;  //r == 13 - 1 ==12 //r == 6-1 == 5
          }


         }
         return ans;
    }
}

小写的字母l和数字1

int mid = l+(r-l)/2,
代码的第8行

int mid = l + (r-l) /2; // mid == 13 //mid == 6 //mid ==3
这里是l吧 不是数字1 吧
这一行错了

当(long) mid * mid == x要return掉mid的值并且不需要定义ans 多次操作会使时间更慢 换成如下:

public static int mySqrt(int x) {
        int l = 1, r = x / 2 + 1;
        // 循环不变量 始终维持在区间 [left, right] 中查找,当 left = right + 1 时,区间为空,查找结束
        // 当 left == right 时,区间 [left, right] 依然有效
        while (l <= r) {
            // 防止溢出
            int mid = l + ((r - l) >> 1);
            // mid 大于 √x ,在 mid 前半区间 [left, mid - 1] 中查找,不是 [left, mid]
            // 是因为会当查找到 target 时,直接返回 mid,所以没必要再考虑 mid
            if (mid > x / mid) {
                r = mid - 1;
                // mid 小于 √x ,在 mid 后半区间 [mid + 1, right] 中查找
            } else if (mid < x / mid) {
                l = mid + 1;
                // mid 等于 √x ,代表查找到 target,则直接返回
            } else {
                return mid;
            }
        }

        return r;
    }