-
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留整数部分 ,小数部分将被舍去。
-
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
public class LC69_SqrtX {
public static void main(String[] args) {
int i = getSqrtX(2147395599);
System.out.println(i);
}
/**
* 解题思路:使用二分查找,只有当mid * mid >= x 时候,才能找到这个数的完全平方根,
* 并且一定在左指针上
* 例如寻找5的平方根,2的平方是小于5的,3的平方是大于5的,此时就应该是2,在左指针
* @param x
* @return
*/
private static int getSqrtX(int x) {
//定义一个左指针
int left = 0;
//定义一个右指针
int right = x;
if (x==1) return 1;
while (right-left > 1) {
int mid = (right + left) / 2;
//在数学层面,x / mid < mid 和 x < mid * mid是一样的,
//但为了避免当X足够大时,小于号右边过大,导致内存溢出,选择第一种写法
if (x / mid < mid) {
right = mid ;
} else {
left = mid;
}
}
return left;
}
}