题目
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sqrtx
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的题解
这题有点迷。我第一反应是牛顿法。。但还是。。
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
return int(x**0.5)
其实有点对不起自己的良心。看评论也都是牛顿迭代或二分法。于是又用二分法和牛顿法又写了一遍。
牛顿迭代公式如下:
x
n
+
1
=
x
n
−
f
(
x
n
)
f
′
(
x
n
)
x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}
xn+1=xn−f′(xn)f(xn)
对于上面这道题,构造
f
(
x
)
=
x
2
−
a
f(x)=x^2-a
f(x)=x2−a,对
f
(
x
)
f(x)
f(x)求根即可得到
a
\sqrt{a}
a的值。经过整理后可得到迭代公式:
x
n
+
1
=
x
n
+
a
/
x
n
2
x_{n+1}=\frac{x_n+a/x_n}{2}
xn+1=2xn+a/xn
因为本题求的是整数部分,要把上式中的除号改成相除取。整蓝后直接写代码就可以了。
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
n=x
while n*n>x:
n=(n+a//n)//2
return n