Leetcode算法——50、实现乘方运算

本文介绍了一种高效实现幂运算的方法——分治法,通过将问题分解为更小的子问题,降低了算法的时间复杂度,从O(n)降低到O(logn)。文章详细解释了如何利用x^n=(x^(n/2))^2的性质来实现快速幂运算,并给出了Python代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现函数 pow(x,n),返回 xnx^nxn

备注:
1、-100.0 < x < 100.0
2、n是一个32位的整数,范围为[−231,231−1][−2^{31}, 2^{31} − 1][231,2311]

示例:

Example 1:
Input: 2.00000, 10
Output: 1024.00000

Example 2:
Input: 2.10000, 3
Output: 9.26100

Example 3:
Input: 2.00000, -2
Output: 0.25000

思路

1、暴力法

根据乘方的定义, xnx^nxn 表示 n 个 x 相乘,那么循环 n 次的乘法即可。

算法复杂度为 O(n)。

2、分治法

根据公式:xn=(xn/2)2x^n = (x^{n/2})^2xn=(xn/2)2,可以将问题转化为求 xn/2x^{n/2}xn/2 的子问题,使用分治法可以解决,分治法的结束条件为 21=22^1=221=2

注意:

  • n/2n/2n/2 可能是小数,因此要提前判断 n 的奇偶性。
  • n 可能是负数,因此要提前将 n 转为整数,并使用公式xn=1/x−nx^n = 1/x^{-n}xn=1/xn

算法复杂度为 O(logn)。

python实现

def myPow(x, n):
    """
    :type x: float
    :type n: int
    :rtype: float
    分治法。
    """
    def fun(x, n):
        '''
        递归,x^n = (x^(n/2))^2
        '''
        # 递归结束条件
        if n == 1:
            return x
        # 递归
        half = fun(x, n // 2)
        if n % 2 == 1: # 如果是奇数,则还需要再乘以一个x
            return half * half * x
        else:
            return half * half
        
    if n == 0:
        return 1
    elif n > 0:
        return fun(x, n)
    else:
        return 1/fun(x, -n)

if '__main__' == __name__:
    x, n = 2.10000, 3
    print(myPow(x, n))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值