您的位置:首页 > 其它

个人记录-LeetCode 69. Sqrt(x)

2017-01-05 20:35 302 查看
问题:

Implement int sqrt(int x).

Compute and return the square root of x.

这个问题的解法有很多,但都比不上牛顿插值法简便。

不过牛顿插值法需要的一定的数学功底。

自己没有在第一时间想到牛顿插值法,

但幸好该方法的数学推理还有影响,可以看懂解法。

假设x=sqrt(n),那么可令f(x)=n-x^2,

求x的值就变成了求f(x)的零点。



牛顿插值法的思想如上图所示(这个图与该函数并不一致,仅作说明用),其中x为最终结果:

随意在函数曲线上取横坐标为Xn点,以其一阶倒数为斜率,做一条直线,

该直线与X轴的交点记为Xn+1。

然后,在函数曲线上取横坐标为Xn+1点,再以其一阶倒数为斜率,做一条直线,

该直线与X轴的交点记为Xn+2。

不断按上面的方式进行下去,最后的结果将逼近实际结果x。

现在我也只记得这么做可以得到结果,具体的原理已经忘了,感兴趣的朋友可以百度一下。

唉,数学知识都还给老师了,惭愧!

假设f(x)是关于X的函数,求出f(x)的一阶导,即斜率:



简化等式可得到:



对于我们的问题:

f(x) = n - x^2,其一阶倒数f’(x) = -2x,

代入上面的公式可得:

Xn+1 = Xn - (n - Xn * Xn ) / (-2 * Xn),简化可得到:

Xn+1 = (Xn + n / Xn) / 2;

按照这个公式可以写出下面的代码:

代码示例:

public class Solution {
public int mySqrt(int x) {
//此处x为上面公式的n
//r为Xn,不断迭代,直到r * r < x
long r = x;

while (r*r > x)
r = (r + x/r) / 2;

return (int) r;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: