Pow(x, n)

这篇博客介绍了如何利用快速幂算法解决指数运算问题,详细解析了递归和非递归两种实现方式,并提供了代码示例。该算法的时间复杂度为O(log n),空间复杂度为O(1)。对于负指数的情况,通过计算x^(-n)再取倒数来处理。
摘要由CSDN通过智能技术生成

原题指路

Pow(x, n)

解题思路

图片2.png
看到pow函数,上来就是一个快速幂。
快速幂递归式
x n = { x n − 1 ⋅ x , i f n i s o d d x n 2 ⋅ x n 2 , i f n i n e v e n b u t n o t 0 1 , i f n i s 0 x^n=\left\{ \begin{array}{l} x^{n-1}\cdot x,&&if&n&is&odd\\ x^{\frac{n}{2}}\cdot x^{\frac{n}{2}},&&if&n&in&even&but&not&0\\ 1,&&if&n&is&0 \end{array} \right. xn=xn1x,x2nx2n,1,ifififnnnisinisoddeven0butnot0

然后,就是将递归式改写为非递归版本,通过对指数进行二进制转换,然后不断右移即可模拟这个过程(因为其实本体是二分法啦)。
若指数为负,那么就先计算 x − n x^{-n} xn,然后再取倒数即可。

时间复杂度: O ( log ⁡ n ) O(\log{n}) O(logn)
空间复杂度: O ( 1 ) O(1) O(1)

代码

class Solution:
    def myPow(self, x: float, n: int) -> float:
        '''
        快速幂
        Args:
            x: 底数
            n: 指数(整数)
        Returns:
            x^n
        '''
        def qpow(N: int) -> float:
            '''
            当指数为正整数时的快速幂
            Args:
                N: 指数
            Returns:
                x^N
            '''
            res = 1.0
            num = x
            while N > 0:
                if N % 2:  # 最后一位为1则代表需要乘
                    res *= num
                num *= num  # 更新乘数
                N >>= 1  # 更新指数
            return res
        return qpow(n) if n >= 0 else 1.0 / qpow(-n)  # 当n为负数时可以先计算x^(-n)然后再取倒数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值