3.先移动start 还是end?只能移动s,e不行.可能是因为while里先移动e的话条件是m * m >= x.但是最后的答案是需要m * m <= x。所以需要先移动s。下次做二分先移动哪个需要看题目的条件。
答案
class Solution {
public int mySqrt(int x) {
if(x == 0)
return 0;
long s = 1, e = x;
while(s + 1 < e){
long m = s + (e - s) / 2;
if(m * m <= x){
s = m;
}else{
e = m;
}
}
//此处先判断s的话也行
if(e * e <= x){
return (int)e;
}
return (int)s;
}
}
用花花模板,只能闭区间,开区间那个不行
用m > x / m 不用m*m>x是为了防止溢出,不过Python没事
class Solution:
def mySqrt(self, x: int) -> int:
l,r = 1,x
while l <= r:
m = l + (r-l)//2 #要取整数,得到是上限,结果要去1
if m > x / m:
r = m - 1
else:
l = m + 1
return l-1
newton
每次用该数和两数的商对半调整 r = (r + x//r) // 2
class Solution:
def mySqrt(self, x: int) -> int:
if not x:
return x
r = x
while r*r > x :
r = (r + x//r) // 2
return r