一、题目
二、解法
按照二分查找法的步骤:
- 确定初始查找范围:由于x的平方根肯定小于x,因此可设left为1,right为x。left此处先不要设为0,下面会讲解原因;
- 二分后得到的mid = left + (right - left) // 2,将mid*mid和x进行比较,为防止mid*mid溢出,改为x/mid和mid进行比较(因此最好初始不要设left为0,例如x=0时,x/mid发生了除以0);
- 当x/mid < mid,说明target在mid左边,更新right = mid-1;当x/mid > mid,说明target在mid右边,更新left = mid + 1;当x/mid=mid,直接返回mid,即为答案;
- 当循环结束时,说明x/mid != mid:两种情况,第一种为x/mid < mid,应该返回right;第二种为x/mid > mid,应该返回right。
class Solution {
public:
int mySqrt(int x) {
int left = 1;
int right = x;
while (left <= right){
int mid = left + (right-left)/2;
if (x/mid > mid){
left = mid + 1;
}
else if (x/mid < mid){
right = mid - 1;
}
else{
return mid;
}
}
if (x == 0){
return 0;
}
else{
return right;
}
}
};