- x 的平方根
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。
方法:二分法
Java 代码要注意到:如果中点 mid 声明为 int 类型,针对大整型测试用例通不过,因此变量需要声明为 long 类型,下同。
事实上,只要单独照顾一下 00 这个特例就可以了。
class Solution {
public int mySqrt(int x) {
if(x==0) return 0;
long left=1,right=x/2;
while(left<right){
long mid=(left+right+1)/2;
long square=mid*mid;
if(square>x){
right=mid-1;
}else{
left=mid;
}
}
return (int)left;
}
}
注意:
//左中位数求法
mid = (left + right )>>>1;
//右中位数求法
mid = (left + right + 1) >>>1;
在此题中使用左中位数 mid=(left+right)>>>1;,会导致出现死循环的情况。所以必须使用右中位数。
另外,对于>>>:
num >>> 1的写法,num >>> 1,相当于num除以2,为什么不直接写num除以2呢?因为计算机中的数据是以二进制的形式存储的,数学运算的加减乘除底层也是二进制移位实现的,直接在二进制上移位,显然要比数学运算来的更直接。