您的位置:首页 > 其它

69 Sqrt(x)_二分查找与牛顿方法

2017-10-06 17:03 253 查看
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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: