题目
Implement int sqrt(int x).
Compute and return the square root of x.
我的解法
public class Solution {
public int mySqrt(int x) {
int s = 1;
int e = x;
long mid = 0;
// 二分查找,缩小范围
while(s <= e){
mid = s + (e - s)/2;
if(mid * mid > x)
e = (int)mid - 1;
else if(mid * mid < x)
s = (int)mid + 1;
else
return (int)mid;
}
int res = 0;
// 上下查找
if(x >= Math.pow(mid + 1, 2))
res = (int)mid + 1;
else if(x >= Math.pow(mid, 2))
res = (int)mid;
else
res = (int)mid - 1;
return res;
}
}
算法分析:先通过二分查找来缩小范围。因为有可能开根号后有小数要取整,所以要通过上下查找来确定答案。
答案方法(同样二分查找,但是代码实现更简介、思想更简洁)
public class Solution {
public int mySqrt(int x) {
int s = 1;
int e = x;
long mid = 0;
// 二分查找,缩小范围
while(s <= e){
mid = s + (e - s)/2;
if(mid * mid > x)
e = (int)mid - 1;
else{
if((mid + 1) * (mid + 1) > x)
return (int)mid;
else
s = (int)mid + 1;
}
}
return 0;
}
}
算法分析:因为如果mid^2<x<(mid + 1)^2,则sqrt(x)=mid。利用此性质,避免了上下查找过程。比我的实现方法简单。