Leetcode 69.求x的根,返回整数

Leetcode 69.求x的根,返回整数

题目

实现int sqrt(int x)函数,计算并返回x的平方根,x是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

方法一:用数学函数

用exp和log函数计算x^1/2; 由于浮点数的精确度,运算过程中存在误差。

class Solution {
public:
    int mySqrt(int x) {
        if(x==0)
        return 0;//预处理x是0的情况
        int ans=(int)exp(0.5*log(x));
        if((long long)(ans+1)*(ans+1)<=x)//ans+1的平方可能溢出
        return ans+1;
        else
        return ans;
       
    }
};

时间复杂度O(1),exp和log函数运行很快

方法二:二分查找

class Solution {
public:
    int mySqrt(int x) {
        int l=0,r=x/2+1,mid;//一个数的平方不会超过它的平方加一
        while(l<=r)
        {
            mid=(l+r)/2;
            if((long long)mid*mid<x)//mid*mid可能溢出
            l=mid+1;
            if((long long)mid*mid>x)
            r=mid-1;
            if((long long)mid*mid==x)
            return mid;
        }
        return r;
    }
};

时间复杂度:O(log(x))

方法三:牛顿迭代

class Solution {
public:
    int mySqrt(int x) {
        if(x==0)return 0;
        double x0=x;
        while(1)
        {
            double x1=(x0+x/x0)/2;//迭代公式
            if(fabs(x0-x1)<1e-6)//迭代终止条件
            break;
            x0=x1;
        }
        return (int)(x0);
    }
};
posted @ 2020-11-01 08:48  inss!w!  阅读(115)  评论(0编辑  收藏  举报