给你一个非负整数 x ,计算并返回 x 的 平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4
输出:2
本题可采用 牛顿迭代法
- 本题我们可以将其抽象成求方程
当
时的 >0 处的解。
- 结合牛顿迭代法,我们可以列出该曲线任意一点切线方程
则其与 x轴交点 (y=0时) 为
此后我们仅需根据公式不断更新x的值即可得到无限逼近
的目标值。
- 对于循环终止条件,仅需判断两次更新的x值间差值小于某一值 (例如
即可)
具体实现如下
public int mySqrt(int x) {
if (x == 0) return 0;
double C = x;
double x0 = x;
while (true) {
double newX0 = 0.5 * (x0 + C/x0);
if (Math.abs(x0-newX0) < 1e-7) {
x0 = newX0;
break;
}
x0 = newX0;
}
return (int) x0;
}