class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 求非负整数 n 的平方根
     * @param n int整型 你需要求 n 的平方根
     * @return double浮点型
     */
    double findSqrt(int n) {
        /*
        //牛顿迭代法
        if(n==0) return 0.0;

        double x=n; //初始化猜测值
        double epsilon = 1e-7;  //精度要求比1e-5更严格一些

        while(true)
        {
            double next_x = (x+n / x) / 2.0;
            if(abs(next_x - x) < epsilon)
            {
                return next_x;
            }
            x = next_x;
        }
        */

        //二分查找
        if(n ==0 ) return 0.0;
        if(n==1) return 1.0;

        double left = 0.0,right = n;
        double epsilon = 1e-7;

        //对于大于1的数,平方根不会超过n/2+1
        if(n>1)
        {
            right = n/2.0 + 1;
        }

        while(right - left > epsilon)
        {
            double mid = left+(right - left) /2.0;
            double square = mid*mid;

            if(abs(square-n)<epsilon)
            {
                return mid;
            }
            else if(square<n)
            {
                left = mid;
            }
            else 
            {
                right = mid;
            }
        }

        return left+(right-left) / 2.0;

    }
};