码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode | sqrt(x)

时间:2015-07-19 10:22:55      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:sqrt

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

leetcode | sqrt(x)

标签:sqrt

原文地址:http://blog.csdn.net/quzhongxin/article/details/46944669

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!