总体思路:二分法。
class Solution {
public:
int mySqrt(int x) {
if (x == 0 || x == 1) return x;
//int l = 0, r = x, mid, sqrt; 除了0外,其他的平方根都在1-x间,但若l = 0,那么x = 1时,会出现mid等于0的情况,从而除以0.若要l = 0,则x = 1 时也要单独判断。
int l = 0, r = x, mid, sqrt;
while (l <= r) {
mid = l + (r - l) / 2;
sqrt = x / mid;
if (sqrt == mid) return mid;
else if (sqrt > mid) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
//return 0; 是因为r是平方根的右边界即sqrt ** 2 <= x 的最大值,在不满足sqrt == mid时跳出循环时r就是解。否则在sqrt == mid时就已经找到了。
return r;
}
};