力扣69 x的平方根:
提示:二分算法
问题描述
给你一个非负整数 x
,计算并返回 x
的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如pow(x, 0.5)
或者 x ** 0.5
。
题解分析:
最直接的办法就是从0
开始顺序查找扫描到x
,依次检查当前值的平方是否小于x
并且后面一个值平方大于x
,显然时间复杂度高,那么可以采用二分查找算法,具体做法:
- 通过双指针
l,r
表示查找的范围 - 比较
mid
值平方是否小于等于x
,满足条件往右找,并保存当前mid
值 - 不满足则说明需要往左找,直到
l>r
退出循环
解决方案:
具体代码如下
// class Solution {
// public int mySqrt(int x) {
// for(int i=0;i<=x;i++){
// if((long)i*i<=x&&(long)(i+1)*(i+1)>x){
// return i;
// }
// }
// return -1;
// }
// }
class Solution{
public int mySqrt(int x){
int l=0,r=x,ans=-1;
while(l<=r){
int middle=(l+r)/2;
if((long)middle*middle<=x){
ans=middle;
l=middle+1;
}else{
r=middle-1;
}
}
return ans;
}
}