LeetCode刷题挑战-javascript:69.Sqrt(x)

337 阅读1分钟

background.webp

「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

题目

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1:

输入:x = 4

输出:2

示例 2:

输入:x = 8

输出:2

解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。  

提示:

  • 0 <= x <= 231 - 1

解题思路

方法一:Math方法直接解答(投机取巧)

通过理解题目意思,其实就是求数学中的算术平方根。

那首先想到的就是JavaScript中的Math里面有个sqrt方法欸刚好可以用,于是就有了下面的解题思路。

一行解决代码难题👇:

/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function(x) {
     return parseInt(Math.sqrt(x));
};

方法二:二分法找右边界

  • k为满足k平方 <= x,集合的最大值
  • 粗略定下检索范围 0~x,k的取值可能区间为[0,x],即 left <= k <= right
    • 我们的循环条件为 left <= right ,终止为 left > right
    • 由于left可能越界,优先返回right
/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function(x) {
    let left=0
    let right=x
    while(left<=right){
        let mid=left+((right-left)>>1)
        if(mid*mid<=x){
            left=mid+1
        }else{
            right=mid-1
        }
    }
    return right
};

方法三:牛顿-拉弗森迭代法

通过下面这张图的计算公式得到解答

image.png

/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function(x) {
    if(x === 0) {
        return 0
    }
    return Math.floor(sqrt(x)(x))
};
// 牛顿-拉弗森迭代法
function sqrt(x) {
    let origin = x;
    return function inner(x) {
        // xn+1 = xn -   f(xn)     /  f'(xn)
        let xn1 = x - (x*x-origin) / (2*x)
        if(x - xn1 <= 0.1) { // 精度问题
            return xn1
        }
        return inner(xn1)
    }
};

结束语

这里是小葵🌻,只要把心朝着太阳的地方,就会有温暖~

让我们一起来攻克算法难关吧!!