实现 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)。

方法二:牛顿迭代法

二分查找——x 的平方根

 

 二分查找——x 的平方根

 

 二分查找——x 的平方根

 

 

复杂度分析

  • 时间复杂度: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;
    }
}

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

相关文章:

  • 2021-09-07
  • 2021-06-25
  • 2021-07-27
  • 2021-11-27
  • 2021-04-20
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-05-20
  • 2022-12-23
  • 2022-02-25
  • 2021-09-01
  • 2022-02-17
  • 2018-03-30
相关资源
相似解决方案