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);
}
};