题目
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。
代码一
暴力解
class Solution {
public int mySqrt(int x) {
for(long i=0;i<=x;i++){
if(i*i<=x&&(i+1)*(i+1)>x){
return (int)i;
}
}
return -1;
}
}
注意点:
1、考虑特殊情况,在内部使用long
代码二
class Solution {
public int mySqrt(int x) {
long left=0;
long right=x/2+1;//至于 x (x ≠ 0) 的平方根一定是落在 [1, x/2 + 1] 区间,而不是落在 [1, x/2] 区间,即右边界 right 取 x/2 + 1,而不取 x/2,这是因为当 x = 1 时,如果 right 取 x/2 的话,由于 x/2 = 0,此时 left = 1,大于 right,以至于直接跳出循环,导致 x 的平方根为 0 。
while(left<right){
long middle=(left+right+1)>>>1;
long square=middle*middle;
if(square>x){
right=middle-1;//注意二分法的范围
}else{
left=middle;
}
}
return (int)left;
}
}
二分法
笔记:
- 由于这个函数是单调递增(有序)的,所以可以用二分法进行求解。
- 比较 mid * mid 跟 x 的大小,相等则直接返回 mid,否则就去以 mid 为分割点的左右区间去查找,是找x的平方根所以x不需要平方。