# x的平方根(69)
# 题目
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
# 示例
输入: 4
输出: 2
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,由于返回类型是整数,小数部分将被舍去。
# 算法
# 二分查找
我们在[0, x]
这个范围内二分查找,找到满足k*k<=x
的最大的k
的值
export const mySqrt = (x) => {
let start = 0,
end = x;
let res = 0;
while (start <= end) {
const mid = ~~((start + end) / 2);
if (mid * mid <= x) (start = mid + 1) && (res = mid);
else end = mid - 1;
}
return res;
};
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 牛顿迭代法(牛顿-拉夫逊方法)
求解数字N
的平方根,我们可以看作求函数f(x) = x^2-N
的非负根
取点(x0, f(x0))
(x0
大于要求的平方根),此时过点(x0, f(x0))
的切线是f(x0) = 2x0*x-x0^2-N
这条切线与y轴的交点是((x0^2+N)/(2x0), 0)
,我们过这点做垂线相交于f(x)
,得到新交点,然后过交点做切线,切线交于y轴...如此往复,与y轴的交点会无限趋近于f(x)
的非负根
我们每次将与y轴交点向下取整,当其平方恰好不大于我们要求的平方根的N
时,即可得到结果
牛顿迭代法 - 百度百科 (opens new window)
export const mySqrt = (x) => {
let xn = x;
while (xn * xn > x) {
xn = ~~((xn * xn + x) / (2 * xn));
}
return xn;
};
1
2
3
4
5
6
7
2
3
4
5
6
7