解法有两个,1.二分法,2. 基本不等式法(牛顿迭代法)
基本知识是: 对于任意的x、不信的话,可以通过求导发现
的极值点为1,值为0.5,当x小于1,y的导数为负,说明y在递减;当x大于1,y的导数为正,说明y在递增,说明0.5是y的最小值,恒大于0。因此我们就可以用0.5x+1作为上界,通过二分求解
二分法,无理解难点,就是边界条件需要琢磨一下。
class Solution:
def mySqrt(self, x: int) -> int:
if x <= 1:
return x
left = 1 #1
right = x //2 +1 # 5, 2
while left < right:
mid = left + (right - left + 1) //2
if mid **2 == x:
return mid
if mid ** 2 < x:
left = mid
else:
right = mid -1
return left
基本不等式法或者称为牛顿迭代法,
class Solution:
def mySqrt(self, x: int) -> int:
if x <=1:
return x
r = x / 2
while r**2 > x:
r = (r + x/r) // 2 # 这里必须是整除
return int(r)