【leetcode】:leetcode 69 Sqrt(x) 牛顿迭代法

这篇博客介绍了如何利用牛顿迭代法解决LeetCode第69题,即求解x的平方根。通过牛顿迭代公式推导,得出迭代更新的表达式,并给出实现该算法的AC代码。当迭代中两点间的误差小于0.0001时,认为找到了近似平方根。

这个题是求x的平方根,这里介绍一种方法叫做牛顿迭代法

牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。 


 


       既然牛顿迭代法可以用来求解方程的根,那么不妨以方程 x2=n 为例,来试着求解它的根。为此。令f(x)=x2n, 也就是相当于求解 f(x)=0 的解,如上图所示。 


       首先随便找一个初始值 x0,如果 x0不是解,做一个经过 (x0,f(x0)) 这个点的切线,与x轴的交点为x1。同样的道理,如果 x1不是解,做一个经过(x1,f(x1))这个点的切线,与x轴的交点为x2。 以此类推。以这样的方式得到的xi会无限趋近于 f(x)=0 的解。 


判断xi是否是f(x)=0的解有两种方法: 一是直接计算f(xi)的值判断是否为0,二是判断前后两个解xixi1是否无限接近。 


经过(xi,f(xi))这个点的切线方程为
f(x)=f(xi)+f(xi)(xxi)
其中,f(x)f(x)的导数,本题中为2x。令切线方程等于 0,即可求出
xi+1=xif(xi)f(xi)



继续化简 


xi+1=xix2in2xi=xixi2+n2xi=xi2+n2xi


基于上述迭代公式,我们其实给出了一个求平方根的算法。事实上,这也的确是很多语言中内置的开平方函数的实现方法。 

然后基于上面的公式推导,我们得到了通过上个点推下个点的递推公式为:


xi+1=xix2in2xi=xixi2+n2xi=xi2+n2xi

因此,我们判定这两个点距离小于0.0001时,我们就可以认为这两个点重合了

给出AC代码如下:

class Solution {
public:
    int mySqrt(int x) {
        if(x==0) return 0;
        double pre,cur = 1;
        do{
            pre = cur;
            cur = x/(2*pre) + pre/2.0; 
        }while(abs(cur-pre)>0.00001);
         return (int)cur;
    }
};


然后谢谢各位收看







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值