65.Sqrt(x)
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
解法①:数学换底公式
import math def func(x): """ 求一个数的平方根,要求不能使用sqrt()内置函数 :param x: int :return: int """ if x == 0: return 0 ans = int(math.exp(0.5 * math.log(x))) return ans+1 if ans ** 2 <= x else ans
注意:
复杂度:
时间复杂度:O(1),由于内置的 exp 函数与 log 函数一般都很快,我们在这里将其复杂度视为 O(1)。
空间复杂度:O(1)。
解法②:二分查找
def mySqrt(x): left,right,ans = 0,x,-1 while left <= right: mid = (left+right) // 2 if mid * mid <= x: ans = mid left += 1 else: right += 1 return ans
复杂度:
时间复杂度:O(logx),即为二分查找需要的次数。
空间复杂度:O(1)。
解法③:牛顿迭代法
牛顿迭代法详解见leetcode官方
def NewtonDieDai(x): if x == 0: return 0 c,x0 = float(x) while True: x = 0.5*(x0+c/x0) if abs(x-x0)<1e-7: break x0 = x return int(x0)
复杂度:
时间复杂度:O(logx),此方法是二次收敛的,相较于二分查找更快。
空间复杂度:O(1)。