递归_medium_50_Pow(x, n)

题目描述

在这里插入图片描述

思路:

  • 类似转成二进制的方法,比如求 315 次方,即 3 15 = 3 1 + 2 + 4 + 8 = 3 1 ∗ 3 2 ∗ 3 4 ∗ 3 8 3^{15} = 3^{1+2+4+8} = 3^1*3^2*3^4*3^8 315=31+2+4+8=3132343810转成二进制为1111
  • 这样我们在计算时就可以利用上次的结果,计算过程类似二分。
  • 时间复杂度 O ( l o g n ) O(logn) O(logn),空间复杂度 O ( 1 ) O(1) O(1)

转成二进制解法

class Solution:
    def myPow(self, x: float, n: int) -> float:
        if not x:
            if n >= 0: return 0  # x 为0时 直接输出0
            else: return float("inf")
        """
        思路:
            先转成二进制
            然后类似于(二分)层层递进,求当前位置的结果
        """
        key = False  # 是否为负数
        if n < 0:
            key = True
            n = -n
        # 转二进制
        res = []  # 存储的是 二进制的逆序
        while n:
            if not n%2:  # 余数为0
                res.append('0')
            else:
                res.append('1')
            n //= 2
        result = 1
        for one in res:
            if one == '1':
                result *= x
            x *= x
        return result if not key else 1/result
  • 当然,我们无需求出二进制的结果,可以直接边求边计算
  • 下面分别给出 递归 和 迭代的代码

递归解法

class Solution:
    def myPow(self, x: float, n: int) -> float:
        def quickMul(N):
            if N == 0:
                return 1.0
            y = quickMul(N // 2)
            return y * y if N % 2 == 0 else y * y * x
        
        return quickMul(n) if n >= 0 else 1.0 / quickMul(-n)
  • 时间复杂度 O ( l o g n ) O(logn) O(logn),空间复杂度 O ( l o g n ) O(logn) O(logn),因为需要栈空间

迭代解法

class Solution:
    def myPow(self, x: float, n: int) -> float:
        if n < 0:
            x = 1/x
            n = -n
        mid_res = x
        res = 1
        while n:
            if n%2:  # == 1
                res *= mid_res
            n //= 2
            mid_res = mid_res*mid_res
        return res
  • 时间复杂度 O ( l o g n ) O(logn) O(logn),空间复杂度 O ( 1 ) O(1) O(1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值