使用二分查找查找数字的平方根

CSn*_*bie 1 java binary-search square-root

我尝试使用二分搜索来查找整数的平方根,但有些我无法通过一些测试用例。

我能够传递 mySqrt(4) = 2,但无法传递 mySqrt(2147395599)

关于我搞砸的地方有什么想法吗?

public static int mySqrt(int x) {
        int left = 0;
        int right = x;

        if(x < 2){
            return x;
        }
        while(left < right){
            int mid = left + ((right - left) / 2);

            if(mid * mid == x){
                return mid;

            }
            else if(mid * mid < x){
                left = mid + 1;
            }
            else{
                right = mid; 
            }
        }
        return left - 1;
    }
Run Code Online (Sandbox Code Playgroud)

MIK*_*KEC 6

因为mid * mid会溢出。您应该使用 long 以避免溢出。然后在返回结果时将其强制转换回 int。

试试这个代码

public static int mySqrt(int x) {
    long left = 0;
    long right = x;

    if(x < 2){
        return x;
    }
    while(left < right){
        long mid = left + ((right - left) / 2);

        if(mid * mid == x){
            return (int)mid;

        }
        else if(mid * mid < x){
            left = mid + 1;
        }
        else{
            right = mid;
        }
    }
    return (int)(left - 1);
}
Run Code Online (Sandbox Code Playgroud)