69. x 的平方根

69. x 的平方根

实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sqrtx

输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。
输入: 4
输出: 2

方法一:暴力法,可能会超过时间限制,C++大概在56ms.

class Solution {
public:
    int mySqrt(int x) {
        if (x== 0) return 0; //=0,直接返回0
        else if(x >= 1 && x < 4) //>=1和<4时,直接返回1
        {
            return 1;
        }
        else
        {
            for (long i = 2; i <= x/2; i++) //此时非负数的平方根不可能超过它的一半
            {
                if (i*i == x)
                {
                    return i;
                }
                else if ((i*i < x) && (((i+1)*(i+1)) > x)) 
                {
                    return i;
                }
            }
        }
        return 0;
    }
};

方法二:二分法

class Solution {
public:
    int mySqrt(int x) {
        //一个数n的平方根,不肯能大于n / 2 + 1
        // 计算过程中可能会溢出,所以用long 和 long long
        long i = 0;
        long j = x / 2 + 1;
        long long mid;
        long long result;
        while(i <= j)
        {
            mid = (i + j) / 2;
            result = mid * mid;
            if (result == x) return mid; //刚好相等直接返回mid
            else if (result < x) i = mid + 1; // 小于时,表明平方根在mid的右边,所以i + 1
            else j = mid - 1;   //大于时,表明平方根在mid的左边,所以j-1
        }
        return j;  //此时返回的是平方根是小数的整数值
    }
};

方法三:牛顿迭代法

class Solution {
public:
    int mySqrt(int x) {
        if (x == 0) return 0;
        double last=0;
        double res=1;
        while(res!=last)
        {
            last=res;
            res=(res+x/res)/2;
        }
        return int(res);
    }
};

牛顿迭代法没看懂,后面再来看,代码搬运别人的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值