[路飞] sqrtX- x 的平方根

146 阅读1分钟

记录 1 道算法题

x 的平方根

leetcode-cn.com/problems/sq…


要求: 给一个整数,返回平方根,返回值进行取整。

最简单的方法是进行枚举尝试,从 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
            }
        }
    }