题目
给你一个非负整数 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; // 返回右边界
};
思路:牛顿迭代法
参考就行
思路分析:题目要求我们求平方根的整数部分,因此可以考虑使用牛顿迭代法求解。假设我们要求解的数为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题中,我们可以使用牛顿迭代法求解平方根的整数部分,具体实现思路是选择合适的初始解,然后根据迭代公式不断更新得到近似解,最终得到所求的整数部分。