实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
当指数为负数的时候,可以转化为底数取导数,指数取相反数的情况,这一点并不难理解。
if n < 0:
x = 1 / x
n = -n
方法1: 暴力破解法
def mypow1(self, x, n):
if n < 0:
x = 1 / x
n = -n
ans = 1
for i in range(n):
ans = ans * x
return ans
复杂度分析
时间复杂度:O(n)O(n). 我们需要将 x 连乘 n 次。
空间复杂度:O(1)O(1). 我们只需要一个变量来保存最终 x 的连乘结果。
方法2:快速幂算法(递归)
假定我们已经得到了 x ^ nx
n
的结果,我们如何得到 x ^ {2 * n}x
2∗n
的结果?很明显,我们不需要将 x 再乘 n 次。使用公式 (x ^ n) ^ 2 = x ^ {2 * n}(x
n
)
2
=x
2∗n
,我们可以在一次计算内得到 x ^ {2 * n}x
2∗n
的值。使用该优化方法,我们可以降低算法的时间复杂度。
def mypow3(self, x, n):
if n < 0:
x = 1 / x
n = -n
return self.fastPow(x, n)
def fastPow(self, x, n):
if n == 0: return 1.0
half = self.fastPow(x, n // 2)
if n % 2 == 0:
return half * half
else:
return half * half * x
复杂度分析
时间复杂度:O(logn).
空间复杂度:O(logn).
方法 3:快速幂算法(循环)
def mypow2(self, x, n):
if n < 0:
x = 1 / x
n = -n
ans = 1
while n:
if n & 1:
ans *= x
x *= x
n >>= 1
return ans
复杂度分析
时间复杂度:O(logn).
空间复杂度:O(1).
网友评论