题目描述:
实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
思路和算法:
由于x平方根的整数部分ans是满足k平方<=x的最大值,因此我们可以对k进行二分查找,求解答案。
二分查找的下界为0,上界可以粗略地设定为x。在二分查找的每一步中,我们只需要比较中间元素mid的平方与x的大小关系,并通过比较的结果调整上下界的范围。由于我们所有的运算都是整数运算,不会存在误差,因此在得到最终答案ans后,也不需要再去尝试ans+1了。
算法java实现:
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;
}
关键步骤:
mid = l + (r-l)/2;
复杂度分析:
- 时间复杂度:O(longx),即为二分查找所需要的次数
- 空间复杂度:O(1)