题目: X 的平方根

来自智得网
跳转至: 导航、​ 搜索

方法一:二分查找

思路:由于 x 的平方根一定小于 x,大于等于 0,所以可以在 0 到 x 之间进行二分查找,找到最大的 mid 值,使得 mid 的平方小于等于 x。


代码(Python):

class Solution:
    def mySqrt(self, x: int) -> int:
        if x == 0:
            return 0
        left, right = 0, x
        while left < right:
            mid = (left + right + 1) // 2
            if mid * mid <= x:
                left = mid
            else:
                right = mid - 1
        return left

方法二:牛顿迭代法

思路:可以使用牛顿迭代法求解平方根,不断迭代,直到达到精度要求。公式为:f(x) = x^2 - n,f'(x) = 2x,根据牛顿迭代公式,可以得到:x = (x + n / x) / 2。不断迭代,直到达到精度要求。

代码(Python):

class Solution:
    def mySqrt(self, x: int) -> int:
        if x == 0:
            return 0
        cur, pre = 1, 0
        while abs(cur - pre) > 1e-6:
            pre = cur
            cur = (cur + x / cur) / 2
        return int(cur)

方法三:数学公式

思路:根据泰勒展开式,可以得到:sqrt(x) = x / (2 * sqrt(x)) + 1 / 2 * (sqrt(x) - x / (2 * sqrt(x))) - 1 / 8 * (sqrt(x) - x / (2 * sqrt(x)))^2 + ...。不断迭代,直到达到精度要求。

代码(Python):

class Solution:
    def mySqrt(self, x: int) -> int:
        if x == 0:
            return 0
        ans = int(math.exp(0.5 * math.log(x)))
        return ans + 1 if (ans + 1) ** 2 <= x else ans