[LeetCode]Sqrt(x)

Implement int sqrt(int x).

Compute and return the square root of x.

class Solution {
public:
    int sqrt(int x) {
        // binary search implementation
        if (x < 2) return x;
        int l = 1, r = x/2; // 初值设为一半
        int ans = 1;
        while (l <= r)
        {
            int mid = l + (r - l) / 2; // 防止溢出
            if (x / mid == mid)
                return mid;
            else if (x / mid < mid)
                r = mid - 1;
            else
            {
                l = mid + 1;
                ans = mid;     // 由于取下整,每次记录较小的迭代值
            }
        }
        return ans;
    }
};

此外,此题也可使用牛顿迭代法。

为了保持符号与题目一致,这里使用纵坐标为a=0,横坐标为b=0的a-b平面直角坐标系。

设f(a) = a^2 - x (注意未知数为a)

牛顿迭代法就是为了求f(a)=0时的正数解。它的记忆可以基于图形的记忆法:a的下一个迭代点a'就是以曲线b=f(a)上在(a,f(a))处的切线与横坐标b=0的交点。

那么 a' = a - f(a)/f'(a) = a - (a^2-x)/(2a) = (a + x/a)/2

一直迭代上式即可收敛。

关于收敛的条件可以搜索“不动点迭代法”查询相关资料。

代码如下:

class Solution {
public:
    int sqrt(int x) {
        if (x <= 0) return 0;
        double y = x, tmp;
        const double eps = 1e-10;
        // newton iteration
        while (abs((tmp = (y + x/y) / 2.0) - y) > eps)
            y = tmp;
        return (int)y;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值