LeetCode热题(JS版) - 69. x 的平方根

105 阅读1分钟

题目

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

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

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

示例 1:

输入:x = 4
输出:2

示例 2:

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

提示:

0 <= x <= 231 - 1

思路:二分法

这是一道简单的数学题。由于题目要求求出整数部分,我们可以尝试使用二分法来解决问题。

  • 假设我们要求x的平方根,我们可以定义左边界为0,右边界为x。
  • 然后,我们将它们的平均值mid作为猜测的答案。
  • 如果mid的平方小于等于x,则说明mid可能是一个正确的答案,我们将mid赋值给左边界;
  • 否则,mid的平方大于x,则说明mid不是一个正确的答案,我们将mid赋值给右边界。

这样,我们每次可以将搜索范围缩小一半,直到找到一个精确的答案或者左边界大于等于右边界为止。

实现代码:

var mySqrt = function(x) {
    let left = 0, right = x;
    while (left <= right) { // 二分搜索
        let mid = Math.floor((left + right) / 2);
        if (mid * mid === x) {
            return mid;
        } else if (mid * mid < x) {
            left = mid + 1;// 后移
        } else {
            right = mid - 1;// 前移
        }
    }
    return right; // 返回右边界
};

image.png

思路:牛顿迭代法

参考就行

思路分析:题目要求我们求平方根的整数部分,因此可以考虑使用牛顿迭代法求解。假设我们要求解的数为x,则令y=x^2-n,将问题转化为求解y的正根,即求解y的平方根。根据牛顿迭代法的公式,我们可以得到如下迭代式:

x1 = (x0 + n / x0) / 2

其中x0为初始解,x1为第一次迭代得到的近似解。重复上述迭代过程,直到x1的平方与n的差小于等于1e-6为止,此时x1即为所求的平方根的整数部分。

代码实现:

var mySqrt = function(n) {
    let x0 = n; // 初始解
    while (x0 * x0 > n) {
        x0 = parseInt((x0 + n / x0) / 2);
    }
    return x0;
};

总结:牛顿迭代法是一种求解方程近似解的方法,它的基本思路是利用泰勒级数展开式,通过不断迭代来逼近方程的根。在LeetCode第69题中,我们可以使用牛顿迭代法求解平方根的整数部分,具体实现思路是选择合适的初始解,然后根据迭代公式不断更新得到近似解,最终得到所求的整数部分。