【LeetCode】Day18

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)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值