您的位置:首页 > 其它

40.Sqrt(x) (二分查找)

2015-10-23 20:41 162 查看
mplement
int sqrt(int x)
.

Compute and return the square root of x.
分析:
这道题目可以用二分查找的方法找 x 的平方根。

public int mySqrt3(int x) {
if(x<=1){
return x;
}
long low = 0;
long high = x;
long mid = 0;//这里用long long 是方便下面计算,如果用int会报错
while(low <= high){
mid = low+(high-low)/2;
if(mid == x/mid){
return (int) mid;
}
if(mid * mid < x){//因为这里有 两个int相乘的情况,可能会溢出,所以要把mid定义成long的形式
low = mid +1;
}else{
high = mid - 1;
}
}
// 当找不到时候,这是low,high指针已经交叉,取较小的,即high
return (int) high;
}


但是需要特别注意的是,当有两个int相乘的时候,要将其定义为long型,否则会造成溢出,使结果不准确。或者定义一个double型来先扩大其字节长度。

public int mySqrt2(int x){
double diff = 0.01;     // 误差
int low = 0;
int high = x;

while(low <= high){
// 注意越界!所以用double来存
double mid = low + (high-low)/2;
if(Math.abs(mid*mid-x) <= diff){
return (int)mid;
}else if(x > mid*mid+diff){
low = (int)mid+1;
}else if(x < mid*mid-diff){
high = (int)mid-1;
}
}

// 当找不到时候,这是low,high指针已经交叉,取较小的,即high
return high;
}


如果一定要定义成int型,那么在计算的时候要先计算除法,避免让两个int直接相乘。

public int mySqrt(int x) {//提交通过
if(x<=1){
return x;
}
int low = 0;
int high = x;
int mid = 0;
while(low <= high){
mid = low+(high-low)/2;
if(mid == x/mid){
return mid;
}
if(mid < x/mid){//当这个地方是mid*mid的时候提交就不通过。因为两个int相乘,很容易造成溢出
low = mid +1;
}else{
high = mid - 1;
}
}
// 当找不到时候,这是low,high指针已经交叉,取较小的,即high
return high;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: