69. x 的平方根
描述
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意: 不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
分析
求目标x的平方根m,使得 m * m = x ,此时可以在 (1,x/2)的区间上使用二分搜索查找m。
边界条件处理:当目标x为0和1,直接返回x即可。
解法
计算mid,使用while进行二分搜索
- 若过程中找到了m,直接返回即可
- 若循环结束也没找到,说明m是浮点数,需要返回向下取整的值。
提问:向下取值的值该怎么去取?
解答:只需要思考一下最后退出循环前的情况(left==right==mid) 。若mid * mid < x, 则left=mid+1,此时right就是向下取值的值。若 mid * mid > x,则right = mid -1, 此时right依然是向下取值的值。所以最后返回right即可。
代码
public int mySqrt(int x) {
if(x<=1){
return x;
}
int left=1;
int right=x/2;
int mid;
while(left<=right){
mid=(left+right)/2;
if(mid==(x/mid)){
return mid;
}else if(mid<(x/mid)){
left=mid+1;
}else{
right=mid-1;
}
}
return right;
}
总结
通过三道二分搜索例题,给出了二分搜索的代码思路。