题目描述
方法一:
一种用指数函数exp和对数函数ln代替平方根函数的方法
代码实现:
class Solution {
public int mySqrt(int x) {
// 方法一:一种用指数函数exp和对数函数ln代替平方根函数的方法
if (x == 0){
return 0;
}
int ans = (int)Math.exp(0.5 * Math.log(x));
// 数字可能太大,最好使用长整型进行强制类型转换,进行log运算一般会出现小数,
// 因为有小数,正确答案和原始的差距肯定是不超过1的,在进行比较的时候,也只需要将前面一个进行强制类型转换
return (long)(ans + 1) * (ans + 1) <= x ? ans+1 : ans;
}
}
方法二:
代码实现:
class Solution {
public int mySqrt(int x) {
// 方法二:涉及到平方,一般可以想到用二分查找的思想
// 在二分查找的每一步当中,我们只需要比较中间元素mid的平方和x之间的大小关系
// 并通过比较的结果调整上下界的范围,二分运算界限都是通过界限,都是整数,不会存在误差
int l = 0, r = x, ans = -1;
while (l <= x){
int mid = l + (r - 1) / 2;
if ((long)mid * (long)mid <= x){
ans = mid;
l = mid + 1;
}else{
r = mid - 1;
}
}
return ans;
}
}