解法1:使用内置函数
class Solution {
public:
int mySqrt(int x) {
return sqrt(x);
}
};
解法2:二分查找
关于二分查找的思想:在下方视频实例中非常清楚。
https://www.bilibili.com/video/av66215410?from=search&seid=17007920321940193951
C++实现:
class Solution {//二分查找法
public:
int mySqrt(int x) {
long i = 0;
long j = x/2 + 1;//数学知识,对于一个非负整数x,它的平方根一定是不会大于 x/n+1的
while(i<=j){//在[i,j]范围内找x的平方根
long mid = (i + j)/2;
if(mid*mid == x) return mid;
else if(mid*mid < x) i = mid + 1;//通过更新i值,在右半区间寻找
else j = mid - 1;//通过更新j值,在左半区间寻找
}
return j;//跳出while说明i>j,此时返回j
}
};
解法3:牛顿迭代法
思想:
下面这种方法可以很有效地求出根号 a的近似值:首先随便猜一个近似值 x,然后不断令 x等于 x和 a/x的平均数,迭代个六七次后 x 的值就已经相当精确了。
例如,我想求根号 2等于多少。假如我猜测的结果为 4,虽然错的离谱,但你可以看到使用牛顿迭代法后这个值很快就趋近于根号 2了:
( 4 + 2/ 4 ) / 2 = 2.25
( 2.25 + 2/ 2.25 ) / 2 = 1.56944..
( 1.56944..+ 2/1.56944..) / 2 = 1.42189..
( 1.42189..+ 2/1.42189..) / 2 = 1.41423..
C++实现:
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; //每次更新res的公式
}//当res不再变化的时候,停止迭代
return int(res);
}
};