解法一
avoid overflow: x/mid >= mid
class Solution {
public:
int mySqrt(int x) {
if(x<=1) return x;
int l=0, r=x;
while(l<r){
int mid = l+(r-l)/2;
if(x/mid>=mid) l=mid+1;
else r=mid;
}
return r-1;
}
};
解法二
class Solution {
public:
int mySqrt(int x) {
if (x == 0) return 0;
double res = 1, pre = 0;
while (abs(res - pre) > 1e-6) {
pre = res;
res = (res + x / res) / 2;
}
return int(res);
}
};
class Solution {
public:
int mySqrt(int x) {
long res = x;
while (res * res > x) {
res = (res + x / res) / 2;
}
return res;
}
};