题目描述
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
提示:
-100.0 < x < 100.0
-231 <= n <= 231-1
-104 <= xn <= 104
示例:
朴素思路
最简单是思路是直接用一层循环(or 递归),可惜会越界,最后几个测试用例通不过
# 这样写会越界,贴出来只是为了记录一下
class Solution(object):
def myPow(self, x, n):
result = float(1)
if n == 0:
return result
elif n > 0:
for i in range(1, n+1):
result *= x
else:
for i in range(1, -n + 1):
result *= x
result = 1 / result
return result
二分思想
要计算x^n,可以等价于计算:x^(n/2) * x^(n/2) = (x^2)^(n/2),如下图:
那么,则要对n进行讨论:
- n为偶数,
- n为奇数,
那么,在计算x^n时,只要
1. 循环每次 x 变成 x^2,同时,n整除2;
2. 初始化一个res=1用来保存幂结果,且初始 x^n = res * x^n 如果待计算幂n为偶数,res不变;如果n为奇数,把当前x乘到res上;
3. 循环结束的条件为:n == 0
下面举一个例子,直观展示算法思想(计算3^5)
算法实现(Python)
class Solution:
def myPow(self, x: float, n: int) -> float:
if x == 0: return 0
res = 1
if n < 0: x, n = 1 / x, -n
while n:
# n & 1 ==> n % 2 == 1
if n & 1: res *= x
x *= x
# n >>= 1 ==> n = n // 2
n >>= 1
return res
复杂度分析
- 时间复杂度:O(log2n)
- 空间复杂度:O(1)