X的平方根
一、题目描述
给你一个非负整数 x
,计算并返回 x
的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5)
或者 x ** 0.5
。
二、解法
1、二分查找 O(logn)
由于x
的算术平方根一定在[0,x]
之中,这道题二分查找的解题思路就是,在[0,x]
范围内查找,看mid
的值是否为x
的算术平方根。
- 如果
mid*mid
大于x
,则查找范围是[left,mid-1]
。 - 如果
mid*mid
小于等于x
,则查找范围是[mid,right]
,先在mid+1
之前取ans = mid
,这样如果mid
就是算术平方根就可以直接返回。
图解算法
Java代码
class Solution {
public int mySqrt(int x) {
int left = 0;
int right = x;
int ans = -1;
while(left <= right){
int mid = (right + left)/2;
//long强制转换,因为int有溢出风险
if((long)mid*mid <= x){
ans = mid;
left = mid + 1;
}else{
right = mid -1;
}
}
return ans;
}
}
三、小结
二分查找并不局限于有序数组,有某种策略来验证中间元素,并将查找范围缩小一半就可以用二分法。