实现 int sqrt(int N) 函数,计算并返回 N 的平方根。
样例
sqrt(3) = 1
sqrt(4) = 2
sqrt(5) = 2
sqrt(10) = 3
挑战
O(log(x))
solution: 如果使用蛮力法来求解的话,肯定是会超时的。因此,我们需要使用牛顿迭代法来求解这问题
牛顿迭代法: 对于给定一个函数f(x) = 0,的解为
x0
;那么我们可以通过牛顿迭代的方法来求解
x0
, 其迭代公式为:
xk+1=xk
-
f(xk)f′(xk)
当
xk+1−xk<ϵ
时停止迭代,
ϵ
为精度,
xk
的初始值一般取0,或者1。
在本题中取
f(x)=x2−N
,因此我们有:
xk+1=xk−x2k−N2∗xk
化简得:
xk+1=12(xk+Nxk)
code :
class Solution {
public:
/**
* @param x: An integer
* @return: The sqrt of x
*/
int sqrt(int x) {
double i = 1, j;
do {
j = (i + x / i) * 0.5;
if (abs(j -i) < 1)
return (int) j;
i = j;
} while (1);
return 1;
}
};