69. x 的平方根

178 阅读1分钟

方法:二分查找

  • 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) {//用long,防止乘积溢出
                return mid;
            } else if ((long) mid * mid < x) {// 因为下取整,所以<x是可以接受的
                left = mid + 1;// 尽量往右靠
                tmp = mid;// 先保留,因为是下去整
            } else {
                right = mid - 1;
            }
        }
        return tmp;
    }
}

// 精确到3位小数
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
}