记录 1 道算法题
x 的平方根
要求: 给一个整数,返回平方根,返回值进行取整。
最简单的方法是进行枚举尝试,从 1 * 1开始。
function mySqrt(x) {
let i = 0
while(i * i <= x) {
i++
}
return Math.floor(i - 1)
}
进行优化的方法是使用二分查找,这样可以避免暴力解的时候做的无用功。
取中间值,当中间值的平方小于 x 的时候,说明取的数字小了,所以左边界往右移,这样取的中间值会变大,反之亦然。
需要注意的一点的,中间值的平方小于等于 x 的时候,左边界的值增大,这时候可能会出现左边界 + 1 之后大于右边界,导致不进入循环,从而得到的结果比正确结果多 1。所以需要进行多一次判断,如果中间值的平方小于等于 x,但是中间值 + 1 的平方大于 x,那么这个 mid 就是我们的答案,也是二分的终止。
function mySqrt(x) {
let a = 0
let b = x / 2 // 一个数的平方根比他的 1/2 小,所以可以缩小一下范围
while(a <= b) {
// 不完全是中间值,往左偏一点,因为平方根很小
const mid = left + ((right - left) >> 1)
if(mid * mid <= x) {
const c = mid + 1
// 多做一次判断
if (c * c > x) {
return mid
}
// 左边界增大
a = c
} else {
// 右边界缩小
b = mid - 1
}
}
}