原题指路
解题思路
看到pow函数,上来就是一个快速幂。
快速幂递归式
x
n
=
{
x
n
−
1
⋅
x
,
i
f
n
i
s
o
d
d
x
n
2
⋅
x
n
2
,
i
f
n
i
n
e
v
e
n
b
u
t
n
o
t
0
1
,
i
f
n
i
s
0
x^n=\left\{ \begin{array}{l} x^{n-1}\cdot x,&&if&n&is&odd\\ x^{\frac{n}{2}}\cdot x^{\frac{n}{2}},&&if&n&in&even&but¬&0\\ 1,&&if&n&is&0 \end{array} \right.
xn=⎩⎨⎧xn−1⋅x,x2n⋅x2n,1,ifififnnnisinisoddeven0butnot0
然后,就是将递归式改写为非递归版本,通过对指数进行二进制转换,然后不断右移即可模拟这个过程(因为其实本体是二分法啦)。
若指数为负,那么就先计算
x
−
n
x^{-n}
x−n,然后再取倒数即可。
时间复杂度:
O
(
log
n
)
O(\log{n})
O(logn)
空间复杂度:
O
(
1
)
O(1)
O(1)
代码
class Solution:
def myPow(self, x: float, n: int) -> float:
'''
快速幂
Args:
x: 底数
n: 指数(整数)
Returns:
x^n
'''
def qpow(N: int) -> float:
'''
当指数为正整数时的快速幂
Args:
N: 指数
Returns:
x^N
'''
res = 1.0
num = x
while N > 0:
if N % 2: # 最后一位为1则代表需要乘
res *= num
num *= num # 更新乘数
N >>= 1 # 更新指数
return res
return qpow(n) if n >= 0 else 1.0 / qpow(-n) # 当n为负数时可以先计算x^(-n)然后再取倒数