一个数 x 的开方 sqrt 一定在 0 ~ x 之间,并且满足 sqrt == x / sqrt 。可以利用二分查找在 0 ~ x 之间查找 sqrt。
class Solution:
def mySqrt(self, x: int) -> int:
if x <= 1:
return x;
l = 1;
h = x;
while l <= h:
mid = l + (h - l) // 2;
sqrt = x / mid;
if sqrt == mid:
return mid;
else:
if sqrt < mid:
h = mid - 1;
else:
l = mid + 1;
return h;
思想就是if sqrt<midsqrt < midsqrt<mid:,说明mid∗mid>xmid*mid>xmid∗mid>x,要让midmidmid变小一点,于是h=mid−1h = mid - 1h=mid−1;,下次mid=l+(h−l)//2mid = l + (h - l) // 2mid=l+(h−l)//2;的时候midmidmid才会变小,
同理if sqrt>midsqrt > midsqrt>mid:,说明mid∗mid<xmid*mid<xmid∗mid<x了,要让midmidmid变大一点,于是l=mid+1l = mid + 1l=mid+1;,当两个界lowlowlow和highhighhigh重叠时,即l=hl=hl=h,那么此时的mid∗midmid*midmid∗mid是大于xxx且最近接xxx的数,于是h−1h-1h−1即为所求。
最后必将收敛到l=k,h=k+1l=k,h=k+1l=k,h=k+1的形式,因为x会夹在两个平方数k2k^2k2和(k+1)2(k+1)^2(k+1)2之间,最后mid=k,mid2<xmid=k,mid^2<xmid=k,mid2<x,对应sqrt<midsqrt<midsqrt<mid,h=kh=kh=k,return hhh正合适