Implement int sqrt(int x)
.
Compute and return the square root of x.
思路:因为本题是int类型的数据,所以可以使用二分法查找。但是面试的时候很少有整数的,所以真正的面试都是double。
int类型如下:
public class Solution {
public int mySqrt(int x) {
if(x <= 1)
return x;
long i = 0;
long j = x/2 + 1;//符合的结果在i-j的范围内
long mid = 0;
while(i <= j){//二分法查询合适的值
mid = (i+j)/2;
if(mid*mid == x)
return (int) mid;
if(mid*mid < x)
i = mid + 1;
else
j = mid - 1;
}
if(mid*mid > x)//微调结果
mid--;
return (int) mid;
}
}
double类型的没办法用二分,只能用牛顿迭代公司求解。
经过(xi, f(xi))这个点的切线方程为f(x) = f(xi) + f’(xi)(x - xi),其中f'(x)为f(x)的导数,本题中为2x。令切线方程等于0,即可求出xi+1=xi
继续化简,xi+1=xi
有了迭代公式,程序就好写了。关于牛顿迭代法,可以参考wikipedia以及百度百科。
代码如下:
public double mySqrt(double x) {
if( x < 0)
return x;
double x0 = x;
while(Math.abs(x0*x0 - x) >= 1e-10){
x0 = (x0 + x/x0)/2;
}
return x0;
}