比如 8
可以看为一个升序的数组
12345678
找m*m<=x 最后一个m
注意!! m*m<=x 要是很大,可能会溢出,所以判断的时候取 mid<=x/mid;
(mid+1)>x/(mid+1)
易错!!一:是> 不是>=
二:x/(mid+1) 要加括号!!!
/**
* @param {number} x
* @return {number}
*/
var mySqrt = function(x) { //这里的临界值为0
if(x==0){
return 0;
}
//把它当一个数组,x从1到x大小分别作为它的left和right
let left=1;
let right=x;
while(left<=right){
let mid=Math.floor(left+(right-left)/2);
if(mid<=x/mid){
if((mid+1)>x/(mid+1)){
//!!易错点!!! 第一次这里x/(mid+1) 没有加括号,使计算错误
return mid;
}
else{
left=mid+1;
}
}
else{
right=mid-1;
}
}
return -1;
};
python版本:
def mySqrt(x: int) -> int:
if x == 0:
return 0
left = 1
right = x
while left <= right:
mid = left + (right - left) // 2
if mid <= x // mid:
if mid + 1 > x // (mid + 1):
return mid
else:
left = mid + 1
else:
right = mid - 1
return -1