思路:
二分法,时间复杂度O(logN),空间复杂度O(1)。
从left = 1, right = x/2出发二分查找res。
c++
class Solution {
public:
int mySqrt(int x) {
int left = 1, right = x/2;
int middle_copy = 0;
if(x < 2) return x;
while(left <= right) {
const int mid = (left + right) / 2;
if(x/mid > mid) {
left = mid + 1;
middle_copy = mid;
}else if(x/mid < mid) {
right = mid - 1;
}else {
return mid;
}
}
return middle_copy;
}
};
java:
public class Solution {
public int mySqrt(int x) {
if(x < 2) return x;
int left = 1, right = x / 2;
int mid_last = 0;
while(left <= right) {
int mid = (left + right) / 2;
// ( mid * mid ) is overflow -> error
// if(mid * mid > x) {
// right = mid - 1;
// }else if(mid * mid < x) {
// left = mid + 1;
// mid_last = mid;
// }else {
// return mid;
// }
if(mid > x / mid) {
right = mid - 1;
}else if(mid < x / mid) {
left = mid + 1;
mid_last = mid;
}else {
return mid;
}
}
return mid_last;
}
}