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

76 篇文章 1 订阅

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

备注:
1、-100.0 < x < 100.0
2、n是一个32位的整数,范围为 [ − 2 31 , 2 31 − 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、暴力法

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

算法复杂度为 O(n)。

2、分治法

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

注意:

  • n / 2 n/2 n/2 可能是小数,因此要提前判断 n 的奇偶性。
  • n 可能是负数,因此要提前将 n 转为整数,并使用公式 x n = 1 / x − n x^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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值