思路一
Python直接用库函数,或者**0.5
class Solution(object):
def mySqrt(self, x):
if x==None or x<0:
return None
return int(x**(0.5))
思路二
采用牛顿迭代法求平方根
牛顿迭代法就是通过迭代求解方程的零点
且用牛顿法去求解平方根是安全的
图中,橙色的雪花点是前一次的位置,一次牛顿迭代后,变化到黄色的雪花点。
由图可知,每一次迭代都可以是x更靠近真实的零点。
详细见参考:
https://www.zhihu.com/question/20690553
https://blog.csdn.net/Timingspace/article/details/50947250
代码
class Solution:
def mySqrt(self, x: int) -> int:
r = x #令初始值等于x
while r*r > x: #终止条件
r = (r + x / r) // 2 #牛顿迭代公式
return int(r)
二分搜索法
class Solution:
def mySqrt(self, x: int) -> int:
# 牛顿迭代法
# 二分搜索法,n的平方根,不会大于n/2, 所以在[0. n//2]内二分搜索
l, r = 0, n//2
while l <= r:
m = (l + r) >> 1
if m * m == x:
return m
elif m * m > x:
r = m - 1
else:
l = m + 1
return l