二分查找——x 的平方根

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

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

示例 1:

输入: 4
输出: 2
示例 2:

输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
  由于返回类型是整数,小数部分将被舍去。

方法一:二分查找

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

复杂度分析

  • 时间复杂度:O(\log x)O(logx),即为二分查找需要的次数。

  • 空间复杂度:O(1)O(1)。

方法二:牛顿迭代法

 

 

 

 

 

 

复杂度分析

  • 时间复杂度:O(\log x)O(logx),此方法是二次收敛的,相较于二分查找更快。

  • 空间复杂度:O(1)O(1)。

class Solution {
    public int mySqrt(int x) {
        if (x == 0) {
            return 0;
        }

        double C = x, x0 = x;
        while (true) {
            double xi = 0.5 * (x0 + C / x0);
            if (Math.abs(x0 - xi) < 1e-7) {
                break;
            }
            x0 = xi;
        }
        return (int) x0;
    }
}

总结:牛顿迭代法更加常用,效率更高。

posted @ 2021-07-17 20:39  zhustarstar  阅读(180)  评论(0编辑  收藏  举报