
方法:二分查找
- x平方根必然小于等于x,大于等于1,因此在[1,x]中查找
- 两个int的乘积可能会越界,因此要用long表示。
- 如果x是完全平方数,那么查找时在while中一定能找到mid*mid恰好等于x,比如16的根为4。
- 如果x不是完全平方数,在while中不会找到mid*mid恰好等于x,比如找8的根,因为8实际的根是2.828。这时候就需要在退出后返回一个最接近x的根的整数值,返回的值应向下取整,具体分析:

class Solution {
public int mySqrt(int x) {
int left = 0, right = x;
int tmp = 0;
while (left <= right) {
int mid = left + (right - left) / 2;
if ((long) mid * mid == x) {
return mid;
} else if ((long) mid * mid < x) {
left = mid + 1;
tmp = mid;
} else {
right = mid - 1;
}
}
return tmp;
}
}
func mySqrt(x float64) float64 {
l, r := 0.0, x
for l <= r {
mid := (l + r) / 2
if x < mid*mid {
r = mid - 0.001
} else {
l = mid + 0.001
}
}
return r
}