题目描述
思路解析动画文字版
最朴素的写法:把 x 连乘 n 次。可 n 最大约 21 亿,连乘 21 亿次必然超时,O(n) 走不通。
关键观察:13 的二进制是 1101,所以 x 的 13 次方 = x¹ × x⁴ × x⁸。只要逐位扫 n,遇到 1 就把当前这块乘进答案。
灵魂帧 · 用 2 的 13 次方慢放:先看清 13 的二进制 1101:从低位到高位,第 0、2、3 位是 1,这三位决定哪些 base 要乘进答案。下面每一轮都拆成『看最低位、决定乘不乘』和『base 平方、n 减半』两帧,节奏全程一致。
初始:ans=1, base=2, n=13:开局三个变量:答案 ans 从 1 起步,base 就是 x(这里是 2),指数 n=13。每轮只盯 n 的最低位。
第 0 轮 · 看最低位:是 1,ans 乘 base:第 0 轮先看最低位:n=13 最低位是 1,把当前 base=2 乘进答案,ans 从 1 变成 2。这一帧只做这一件事——乘答案,base 还没动。
第 0 轮 · 收尾:base 平方,n 减半:本轮收尾固定两步:base 自己平方(2 变 4,代表 x²),n 右移一位(13 变 6)。base 翻倍指数,对应二进制往高位走。
第 1 轮 · 看最低位:是 0,跳过乘法:进入第 1 轮,base 此刻是 4(上一轮平方而来,代表 x²)。看最低位:n=6 最低位是 0,说明 x² 这一项不要,ans 保持 2 不动。这一帧只是『看一眼、不乘』。
第 1 轮 · 收尾:base 平方,n 减半:和每轮一样收尾:base 平方(4 变 16,代表 x⁴),n 减半到 3。注意——base 在每轮结尾都恰好平方一次,时序固定,别数多也别数漏。
第 2 轮 · 看最低位:是 1,ans 乘 16:第 2 轮先看最低位:n=3 最低位是 1,此刻 base=16 正好代表 x 的 4 次方,乘进答案,ans 从 2 变 32。这一帧 base 仍是 16,还没平方。
第 2 轮 · 收尾:base 平方,n 减半:本轮收尾照旧:base 平方(16 变 256,代表 x⁸),n 减半到 1。记住这一步——256 是在第 2 轮结尾才长出来的,下一轮直接拿来用,不会再平方第二次。
第 3 轮 · 看最低位:是 1,ans 乘 256:最后一轮,base 此刻正是 256(上一轮已由 16 平方而来,代表 x⁸),最低位仍是 1,直接 ans = 32 × 256 = 8192。这里没有任何『再平方』动作——256 是上轮收尾就备好的。
第 3 轮 · 收尾:n 减半归 0,循环结束:收尾仍是同两步:base 再平方成 65536(但 n 已为 0,这个值用不上了),n 减半归 0。while 退出,ans=8192 正是 2 的 13 次方。每轮结尾平方一次,全程数下来 base 恰好平方了 4 次。
负指数:开头先倒数:遇到负指数别在循环里特判。开头统一把 x 变成它的倒数、n 取相反数变成正数,后面主循环完全一样。
一句话本质:n 的二进制每个为 1 的位,对应的 base 恰好是 x 的那一段,乘进去就还原了 x 的 n 次方。
边界三连:边界比主体更容易拉分:n=0 要返回 1,负指数要倒数,而 32 位最小值取负这一步若不用 long 会直接溢出成负数。
面试追问:面试三连:递归写法、浮点容差、整数边界。把 long 防溢出这点主动讲出来,最加分。
同一套「遇 1 就乘、每轮平方」可迁移:把 base 换成矩阵,就能 O(log n) 求斐波那契、数图上长度为 n 的路径数。
参考代码
class Solution: def myPow(self, x: float, n: int) -> float: if n < 0: x = 1 / x n = -n ans = 1.0 base = x while n: if n & 1: ans *= base base *= base n >>= 1 return ans复杂度
- 时间复杂度:O(log n),每轮指数减半,循环次数等于 n 的二进制位数
- 空间复杂度:O(1),迭代版只用 ans / base / n 三个变量
可套用的代码模板
这套四步骨架只服务快速幂:① 负指数转正 ② 看最低位决定乘不乘 ③ base 平方 ④ 指数减半。换底数为矩阵就是矩阵快速幂。
# 快速幂骨架:把指数 n 拆二进制if n < 0: # ① 负指数先转正 x, n = 1 / x, -nans, base = 1.0, xwhile n: if n & 1: # ② 当前最低位是 1 吗 ans *= base # 是 → 乘进答案 base *= base # ③ base 平方(指数翻倍) n >>= 1 # ④ 指数减半return ans易错点
面试追问把动画讲成自己的话
追问能写成递归版吗?
追问浮点精度怎么保证?
追问为什么 C++ 和 Java 要用 long 接指数?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
字符串相乘
LeetCode 43 · 中等 · 沿着 数学 & 几何 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题