个人记录-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;
按照这个公式可以写出下面的代码:
代码示例:
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; } }
相关文章推荐
- LeetCode(69)Sqrt
- leetcode 69 Sqrt(x)
- [leetcode] 69.Sqrt(x)
- LeetCode---(69)Sqrt(x)
- leetcode 69: Sqrt(x)
- Leetcode 69 sqrt(x)
- [Java]Leetcode69 Sqrt(x)
- LeetCode 69 Sqrt(x)
- leetcode || 69、Sqrt(x)
- [Leetcode 69, Medium] Sqrt(x)
- LeetCode 69. Sqrt(x)
- [leetcode] 69 Sqrt(x)
- [leetcode 69] Sqrt(x)
- LeetCode-69 Sqrt(x)
- [Leetcode] 69. Sqrt(x)
- LeetCode 69 — Sqrt(x)(C++ Java Python)
- [LeetCode]69 Sqrt(x)
- LeetCode 69.Sqrt(x)
- Sqrt(x) - LeetCode 69
- LeetCode(69) Sqrt(x)