x 的平方根
x 的平方根
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
作者:LeetCode
链接:https://leetcode.cn/leetbook/read/binary-search/xe9cog/
来源:力扣(LeetCode)
class Solution {
public int mySqrt(int x) {
int i = 1;
int j = x;
int ans = 0;
while (i <=j){
int mid = i + (j-i)/2;
// upper bound的形式,因为我们要找的ans要是最接近于x的最大的数,利用upper bound
if (mid <= x/mid){
i = mid +1;
ans = mid; // 只要mid <= x/mid,left左边界就会一直向右移动,ans就会一直更新(变大),直到不在满足mid <= x/mid的条件为止,ans就会停止更新,永远停在满足mid<=x/mid条件下面的最后一次更新,即满足ans * ans <= mid的最大值。
}
else
j = mid-1;
}
return ans;
}
}
class Solution {
public int mySqrt(int x) {
if(x < 2)
return x;
int left = 1, right = x;
while(left <= right){
int mid = (left + right) >>> 1;
if(x / mid == mid)
return mid;
else if(x / mid < mid)
right = mid - 1;
else
left = mid + 1;
}
return right;
}
}
作者:Ebisu
链接:https://leetcode.cn/leetbook/read/binary-search/xe9cog/?discussion=oeKufZ
来源:力扣(LeetCode)
class Solution {
public:
int mySqrt(int x) {
int l = 0, r = x, ans = -1;
while (l <= r) {
int mid = l + (r - l) / 2;
if ((long long)mid * mid >= x) {
ans = mid; r = mid - 1;
} else {
l = mid + 1;
}
}
return ans;
}