1.采用二分查找方法
二分查找是对有序数组的一种简单方法,时间复杂度为O(logn),关键是hi如何取中点值。
注意如何取中点值,并且注意mid要写在while中每次都要更新:mid=lo+(hi-lo)/2,最小值加上最大减最小除2;
注意如何返回非正常值,return hi
class Solution {
public int mySqrt(int x) {
int lo=1;
int hi=x;
int mid;
//int su;
while(lo<=hi){
mid=lo+(hi-lo)/2;
//su=mid*mid;
if (mid==x/mid) return mid;
else if(mid<x/mid) lo=mid+1;//问题:为什么要用除法判断相等,为什么不能用相乘
else hi=mid-1;
}
return hi;
}
}
2牛顿法
将求x=sqrt(n)的问题转为求方程f(x)=0的解:
牛顿法可以很好快速求得f(x)=0的近似解,迭代公式如下:
对于本题来说,f(x)的导数即为2x,问题可以进一步转为:
收敛结果为|f(x)|<epsilon或|x1-x2|<epsilon。
public class Solution {
public int mySqrt(int x) {
if (x <= 1) return x;
double x1 = 0, x2 = 1;
while (Math.abs(x1 - x2) > 0.000001) {
x1 = x2;
x2 = x1 / 2 + (double)x / (2 * x1);
}
return (int)x1;
}
}