Java-LeetCode69. 求平方根-二分查找 | 牛顿迭代法

求平方根

http://www.nowcoder.com/questionTerminal/09fbfb16140b40499951f55113f2166c

  • 算法
    • 二分查找
    • 1.初始范围为1,x
    • 2.当middle*middle <= x && (middle+1)*(middle+1) > x时,返回结果
    • 3.当middle*middle < x时,到右半部分继续寻找
    • 4.当middle*middle > x时,到左半部分继续寻找
    • ps:避免溢出使用逆向运算
public int mySqrt(int x) {
    if (x <= 0) {
        return 0;
    }

    int left = 1, right = x;
    while (true) {
        int middle = (left + right) >> 1;
        if (middle <= x / middle && (middle+1) > x / (middle+1)) {
            return (int) middle;
        } else if (middle < x / middle) {
            left = middle + 1;
        } else {
            right = middle - 1;
        }
    }
}
  • 算法
    • 牛顿迭代法:``
    • 在这里:``
    • 1.x0 = N
    • 2.x1 = (x0 + N / x0 ) / 2
    • ps:没想到好的的避免溢出方法,直接用long整型
public int mySqrt(int x) {
    if (x <= 0) {
        return 0;
    }

    long r = x;
    while (r > x / r) {
        r = (r + x / r) / 2;
    }
    return (int) r;
}
LeetCode题解 文章被收录于专栏

测试

全部评论
方法一,定义left、right、middle为long类型
点赞 回复 分享
发布于 2021-08-31 17:57
方法一 这个left=middle+1; right = middle-1 这肯定不对啊 这个回答是第一个感觉很有误导性
点赞 回复 分享
发布于 2021-08-16 10:10
第一种方法有问题吧
点赞 回复 分享
发布于 2021-08-16 10:02

相关推荐

评论
43
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务