问题描述
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
思路
用mid*mid <= x && (mid+1)*(mid+1) > x判断,mid*mid有可能会溢出,超过int最大值。
因此采用x/mid >= mid && x/(mid+1) < mid+1来判断是不是平方根。
另外,求中间值最好使用left+(right-left)/2。(left+right)/2,当left和right都很大的时候,可能会造成越界。
class Solution {
public int mySqrt(int x) {
if(x == 0){
return 0;
}
int left = 1, right = x/2+1;
while(left <= right){
int mid = (left + right)/2;
//if(mid*mid <= x && (mid+1)*(mid+1) > x){
if(x/mid >= mid && x/(mid+1) < mid+1){
return mid;
}else if(x/mid < mid){
right = mid - 1;
}else{
left = mid + 1;
}
}
return right;
}
}