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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HappyRocking/article/details/84829382

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

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

示例:

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 表示 n 个 x 相乘,那么循环 n 次的乘法即可。

算法复杂度为 O(n)。

2、分治法

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

注意:

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

算法复杂度为 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))

猜你喜欢

转载自blog.csdn.net/HappyRocking/article/details/84829382