当前位置: 代码迷 >> 综合 >> leetcode | sqrt(x)
  详细解决方案

leetcode | sqrt(x)

热度:99   发布时间:2023-12-13 19:30:12.0

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 的导数)。然后我们计算穿过点 (x0,f(x0)) 并且斜率为 f(x0) 的直线和x轴的交点的x坐标,也就是求如下方程的解:

f(x0)=(x0?x)?f(x0)

我们将新求得的点的 x 坐标命名为 x1 ,通常 x1 会比 x0 更接近方程 f(x)=0 的解。因此我们现在可以利用 x1 开始下一轮迭代。迭代公式可化简为如下所示:

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;}
};