分治-二分查找
注意没有相等的时候,要保存较小的
class Solution {
public:
int mySqrt(int x) {
int left = 1, right = x / 2;
int last_mid; // 记录最近一次mid
if (x < 2) return x;
while(left <= right) {
const int mid = left + (right - left) / 2;
if(x / mid > mid) { // 不要用x > mid * mid,会溢出
left = mid + 1;
last_mid = mid; // 2 -> 1 ,选小的
} else if(x / mid < mid) {
right = mid - 1;
} else {
return mid;
}
}
return last_mid;
}
};