今天是第14道题。实现 int sqrt(int x)
函数,计算并返回 x 的平方根,其中 x 是非负整数,由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
题目:实现 int sqrt(int x)
函数,计算并返回 x 的平方根,其中 x 是非负整数,由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4 输出: 2
示例 2:
输入: 8 输出: 2 说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
解法1。常规的二分法,不断逼近最接近sqrt(x)的值
class Solution:
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
# V 1.0,能提交
left = 0
right = x
mid = x//2 # 注意这里是向下取整,应题目要求舍去小数部分
while left <= right:
mid_2 = pow(mid,2)
if mid_2 < x:
left = mid + 1
elif mid_2 > x:
right = mid - 1
else:
return mid
mid = (left+right)//2 # 注意这里mid的更新写在最后,也就是left和right更新之后,而不是之前
return mid
解法2。牛顿-拉弗森法用来算平方根:设某数为p,则有方程,方程的0根即为所求数的平方根。用牛顿-拉弗森方法解非线性方程的牛顿法是把非线性方程线性化的一种近似方法。把在点附近展开成泰勒级数 取其线性部分,作为非线性方程的近似方程,即泰勒展开的前两项,则有,设则其解为这样,得到牛顿法的一个迭代序列:,再代入,得到的迭代公式:,然后就可以比较迭代出的值和目标值的差是否满足精度范围。
class Solution:
def mySqrt(self, x):
k=1
while(abs(k**2-x)<1e-4):
k = (k+x/k)/2 # y值的迭代公式
return k
解法1:https://blog.csdn.net/weixin_41958153/article/details/81448615
解法2:https://blog.csdn.net/dawnbreak/article/details/3308413