思路
- 采用二分的思想,将
n(阶数)降次(除2向下取整),即
x^n = (x^{2})^{n/2}, & \text {$n$为偶数}
\\ x^n = x*(x^{2})^{n/2}, & \text{$n$为奇数}
\end{cases} $$
2. 通过把`n转化为二进制`提升运算速度
* 除以2(向下取整):`n >>= 1`,即右移一位
* 设 res=1,则初始状态 $x^n=x^n*res$
* 在循环二分时,每当 n为奇数时,将多出的一项 x 乘入 res ,则最终可化至 $x^n=x^0×res=res$ 返回 res 即可。
3. 下图以 $3^5$ 为例:
* [](https://imgchr.com/i/dttuQS)
# 代码实现
```
class Solution:
def myPow(self, x: float, n: int) -> float:
if n == 0: return 1
res = 1
if n < 0: x, n = 1/x, -n # 若n小于0
while n:
if n & 1:
res *= x
n >>= 1
x *= x
return res
```
* 时间复杂度 O(logn) : 二分的时间复杂度为对数级别。
* 空间复杂度 O(1) : res 等变量占用常数大小额外空间。