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; // initwhile (abs(root*root - x) > 0.1) {root = 0.5*(root+x/root); // 牛顿迭代公式}return (int)root;}
};