1问题描述
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
求解
二分法
单调递增可以用二分查找法
l=0 r=y 所求平方的数
mid=(l+r)/2
y=mid*mid
if y>y0 r=mid
if y<y0 l=mid
fabs(r-l)<1e-9
class Solution:
def mySqrt(self, x: int) -> int:
if x==0 or x==1:
return x
l=1
r=x
res=0
while l<=r:
m=(l+r)//2
if m==x/m:
return m
elif m>x/m:
r=m-1
else:
l=m+1
res=m
return res
牛顿迭代法
不断枚举,枚举一点求他的根来逼近所求的根,通过下式来不断迭代,具体理论如下
x
n
+
1
=
x
n
−
f
(
x
n
)
f
′
(
x
n
)
x_{n+1}=x_{n}-\frac{f\left(x_{n}\right)}{f^{\prime}\left(x_{n}\right)}
xn+1=xn−f′(xn)f(xn)
=
x
n
−
x
n
2
−
y
0
2
x
n
\begin{array}{l}{=x_{n}-\frac{x_{n}^{2}-y_{0}}{2 x_{n}}} \\ \end{array}
=xn−2xnxn2−y0
=
x
n
+
y
0
2
/
x
2
=\frac{x_{n}+y_{0}^{2}/ x}{2}
=2xn+y02/x
class Solution:
def mySqrt(self, x):
if x <= 1:
return x
r = x
while r > x / r:
r = (r + x / r) // 2
return int(r)