leetcode | sqrt(x)

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)=(x0x)f(x0)

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

xn+1=xnf(xn)f(xn)

对于求a的m次方根。
以牛顿法来迭代:

xn+1=xnf(xn)f(xn)

xn+1=xnxmnamxm1n

xn+1=xnxnm(1axmn)

(或 xn+1=xn1m(xnaxnxnm) )

将本题中的 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;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值