LeetCode题解(python)
69. x 的平方根
实现 int sqrt(int x)
函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
解题心得
解答本题,首先想到的肯定是用x*x逼近,可是这样太暴力了,很容易超时的呀,所以要想其他方法。
牛顿迭代法上线~
解答本题,也就是解非线性方程 t 2 − x = 0 t^2-x = 0 t2−x=0,令 f ( t ) = t 2 − x f(t) = t^2-x f(t)=t2−x
根据牛顿迭代法:
t 1 = t 0 − f ( t 0 ) f ′ ( t 0 ) t_1 = t_0 - \frac{f(t_0)}{f'(t_0)} t1=t0−f′(t0)f(t0)
代入 f ( t ) f(t) f(t)得
t 1 = t 0 / 2 + x / ( 2 × t 0 ) t_1 = t_0/2+x/(2 \times t_0) t1=t0/2+x/(2×t0)
… \dots …以此类推
t n = t n − 1 / 2 + x / ( 2 × t n − 1 ) t_n = t_{n-1}/2+x/(2 \times t_{n-1}) tn=tn−1/2+x/(2×tn−1)
计算每个 t t t对应的 f ( t ) f(t) f(t)
当 f ( t ) < 1 f(t)<1 f(t)<1的时候,停止即可。(结果只要整数部分,所以只要最后误差小于1即可)
以下程序:
执行用时 : 64 ms, 在Sqrt(x)的Python3提交中击败了87.45% 的用户
内存消耗 : 13.2 MB, 在Sqrt(x)的Python3提交中击败了57.12% 的用户
解题代码
class Solution:
def mySqrt(self, x: int) -> int:
if x<2:
return x
t0 = x
err = 2^31
while err>=1:
t1 = t0/2 + x/(2*t0)
t0 = t1
err = pow(t0,2) - x
return int(t0)