难度简单563
实现
int sqrt(int x)
函数。计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4 输出: 2示例 2:
输入: 8 输出: 2 说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
class Solution {
public:
int mySqrt(int x) {
return int(sqrt(x));
}
};
这是一个非常不可取的办法,利用函数并且强转成int型,非常不可取!
下面是重要的
官方上说:x的平方根是一道常见的面试题,那么就要好好看看这题,在平时多加积累。
袖珍计算器算法
是用指数函数exp和对数函数ln代替平方根函数的方法
因为计算结果是有误差的,在得到结果的整数部分res,需要对res+1和res哪一个是正确答案作出判断。
class Solution {
public:
int mySqrt(int x) {
if(x == 0)
return 0;
int res = exp(0.5 * log(x));
if((long long)(res + 1) * (res + 1) <= x){
return res + 1;
}
else{
return res;
}
}
};
二分查找
如果袖珍计圈器算法我不会的话,二分查找是比较好想法的解决办法。
二分查找思路是这样的,left和right分别从两边逼近,mid是这两个数的中间,然后检验mid的平方是不是很接近x。这个方法就是用逼近的方式俩就得结果的。
需要注意的是,在mid * mid 这里将它转成long long来防止溢出。
class Solution {
public:
int mySqrt(int x) {
int left = 0, right = x, res = 0;
int mid = (right + left) / 2;
while(left <= right){
if ((long long)mid * mid <= x){
res = mid;
left = mid + 1;
}else{
right = mid - 1;
}
mid = (right + left) / 2;
}
return res;
}
};
总结一下,二分查找很好理解和实现,需要对边界控制好。