x 的平方根
袖珍计算器算法
a满足 a*a ≤ x < (a+1)(a+1)
(a+1)(a+1) ≤ n ? a+1 : a
public int mySqrt1(int x) {
if(x == 0) return 0;
int ans = (int)Math.exp(0.5*Math.log(x));
return (long)(ans+1)*(ans+1)<= x ? ans+1 :ans;
}
二分法查找
时间复杂度:O(\log x)O(logx),即为二分查找需要的次数。
空间复杂度:O(1)O(1)。
public static int mySqrt2(int x) {
//下限
int offline = 0;
//上限
int Online = x;
int ans = -1;
while(offline <= Online){
int mid = offline+ (Online-offline)/2;
if ((long)mid*mid <= x){
ans = mid;
offline = mid+1;
} else {
Online = mid-1;
}
}
return ans;
}