题目
计算并返回 x 的平方根,其中 x 是非负整数。
方法二:二分查找
比较中间元素 mid 的平方与 x 的大小关系,并通过比较的结果调整上下界的范围。
class Solution {
public int mySqrt(int x) {
int l=0,r=x,ans=-1;
while(l<=r){
int mid=l+(r-l)/2;
if((long)mid*mid<=x){
ans=mid;
l=mid+1;
}
else{
r=mid-1;
}
}
return ans;
}
}
复杂度分析
时间复杂度: O(logx),即为二分查找需要的次数。
空间复杂度:O(1)
方法三:牛顿迭代
快速求解函数零点。y=x2−C,相邻两次迭代得到的交点非常接近时结束
public int mySqrt(int x) {
if(x==0){
return 0;
}
double C=x,x0=x;
while(true){
double x1=0.5*(x0+C/x0);
if(Math.abs(x0-x1)<1e-7){
break;
}
x0=x1;
}
return (int)x0;
}
复杂度分析
时间复杂度: O(logx),此方法是二次收敛的,相较于二分查找更快。
空间复杂度: O(1)。