sqrt(x) : https://leetcode.com/problems/sqrtx/
Implement int sqrt(int x).
Compute and return the square root of x.
解析:
容易想到的是用二分法去试,但收敛速度太慢,不能满足时间要求。
我们知道求根公式,牛顿迭代法 点击查看维基百科
首先,选择一个接近函数
f(x)
零点的
x0
,计算相应的
f(x0)
和切线斜率
f′(x0)
(这里
f′
表示函数
f
的导数)。然后我们计算穿过点
f(x0)=(x0−x)⋅f′(x0)
我们将新求得的点的 x 坐标命名为
xn+1=xn−f(xn)f′(xn)
对于求a的m次方根。
以牛顿法来迭代:
xn+1=xn−f(xn)f′(xn)
xn+1=xn−xmn−amxm−1n
xn+1=xn−xnm(1−ax−mn)
(或 xn+1=xn−1m(xn−axnxnm) )
将本题中的 m=2 带入得到, xn+1=12(xn+axn)
class Solution {
public:
int mySqrt(int x) {
if (x == 0 || x < 0)
return 0;
double root = x/2.0; // init
while (abs(root*root - x) > 0.1) {
root = 0.5*(root+x/root); // 牛顿迭代公式
}
return (int)root;
}
};