快速幂位运算-剑指 Offer 16. 数值的整数次方

165 阅读1分钟

题目链接

思路

  1. 采用二分的思想,将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$ 为例: * [![dttuQS.md.png](https://s1.ax1x.com/2020/08/21/dttuQS.md.png)](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(log⁡n) : 二分的时间复杂度为对数级别。 * 空间复杂度 O(1) : res 等变量占用常数大小额外空间。