屁儿擦爽a
2021-07-23 16:58
采纳率: 98.3%
浏览 43
已结题

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;
    }
}

  • 好问题 提建议
  • 收藏

3条回答 默认 最新

  • D_Le 2021-07-23 17:08
    已采纳

    小写的字母l和数字1

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

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • 曦陽惜夏 2021-07-23 17:09

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

    评论
    解决 无用
    打赏 举报
  • 404警告 2021-07-23 17:29

    当(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;
        }
    
    
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题