题目链接
思路
基本思路是在区间 \([1, x/2]\) 中使用二分查找(因为平方根必然小于 \(x/2\)),只不过需要注意一些细节。
- 因为使用的是闭区间查找,所以判断循环终止的条件为 \(left \leq right\)。
- 为了防止溢出,使用
mid = (right - left) / 2 + left
和mid == x / mid
进行运算与判断。 - 同样是因为闭区间查找,所以在 \(mid\) 已经判断过的情况下,变换左右边界应该跳过 \(mid\),所以变换为 \(left = mid + 1\) 和 \(right = mid - 1\)。
- 因为终止条件为 \(left \leq right\),所以在跳出循环的时候必然有 \(right < left\),所以要返回的是 \(right\)。
代码
class Solution {
public int mySqrt(int x) {
if(x == 0){
return 0;
}
if(x == 1){
return 1;
}
int left = 1;
int right = x / 2;
while(left <= right){
int mid = (right - left) / 2 + left;
if(mid == x / mid){
return mid;
}else if(mid > x / mid){
right = mid - 1;
}else{
left = mid + 1;
}
}
return right;
}
}
标签:right,int,mid,查找,69,平方根,LeetCode,left
From: https://www.cnblogs.com/shixuanliu/p/17378844.html