X的平方根
X的平方根
题目链接
题目描述
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4
输出:2示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。提示:
0 <= x <= 231 - 1
题目解法
第一种:袖珍计算器算法,使用指数函数exp和对数函数log代替平凡根函数,指数函数和对数函数的参数和返回值都为浮点型,在运算中可能会存在误差,因此在得到结果后,要验算 结果 和结果+1哪一个才是正确答案
时间复杂度O(1) 空间复杂度O(1)
public static int mySqrt(int x) {
if(x == 0) {
return 0;
}
int n = (int)Math.exp(0.5 * Math.log(x));
//验算结果并返回
return (n + 1) * (n + 1) <= x ? n + 1 : n;
}
第二种:二分查找,由于x的平方根的整数部分 k满足 k² <= x的最大值,因此可以对k进行二分查找,从而得到答案。二分查找的下界为 0,上界可以粗略地设定为 x。在二分查找的每一步中,我们只需要比较中间元素 mid 的平方与 x 的大小关系,并通过比较的结果调整上下界的范围
public static int mySqrt2(int x) {
int j = 0,r = x,n = -1;
while (j <= r) {
int mid = j + (r - j) / 2;
//转为long类型是防止相乘溢出(大于Int的范围)
if((long) mid *mid <= x) {
n = mid;
j = mid + 1;
}else {
r = mid - 1;
}
}
return n;
}