69.x的平方根

题目链接

给你一个非负整数 x ,计算并返回 x 的算术平方根 。

由于返回类型是整数,结果只保留整数部分 ,小数部分将被舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例1:

  1. 输入:x = 4
  2. 输出:2

示例2:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

提示:

  • 0 <= x <= 2 31 - 1

二分查找

class Solution {
    public int mySqrt(int x) {
        int left = 1;
        int right = x;
        int mid = x / 2;
        while(left <= right){
            if(mid * mid == x){
                // 算数平方根是整数的
                return mid;
            }
            // 乘法超出int范围->long
            else if((long)mid * mid < x){
                // mid * mid 比 x 小
                if((long)(mid + 1) * (mid + 1) > x){
                    // mid * mid 比 x 小且(mid + 1) * (mid + 1)比 x 大
                    return mid;
                }else if((long)(mid + 1) * (mid + 1) == x)
                {
                    // mid * mid 比 x 小且(mid + 1) * (mid + 1)等于x
                    return mid + 1;
                }else{
                    // 否则查找范围在右半边
                    left = mid + 1;
                }
            }else if((long)mid * mid > x){
                // 查找范围在左半边
                right = mid - 1;
            }
            mid = left + (right - left) / 2;
        }
        return 0;
    }
}
  • 官方题解
class Solution {
    public int mySqrt(int x) {
        int l = 0, r = x, ans = -1;
        while (l <= r) {
            int mid = l + (r - l) / 2;
            if ((long) mid * mid <= x) {
                ans = mid;
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        return ans;
    }
}

牛顿迭代法