题目描述
思路解析动画文字版
记住两条线:base 每步自乘平方升档(x,x²,x⁴,x⁸…);result 只在「当前二进制位是 1」时把 base 乘进去。
先把 n=11 写成二进制 1011。下面把它低位在左摆开,指针 i 从最低位扫到最高位。result 起步 1,base 起步 x=2。
二进制第 k 位的权重是 2^k。11 = 1+2+8,所以 2^11 只需把这几档(x 的 2^k 次方)乘起来。
一切就绪:result=1、base=x=2,指针 i 落在最低位(第 0 位)。下面开始逐位处理。
指针 i 走到第 0 位,这一位是 1。是 1,说明 x 的这一档(base)要算进答案。
这一位是 1:把当前档 base=2 乘进结果,result 从 1 变成 2。
不管这一位是几,扫完都把 base 自乘平方:base 从 2 升到 4,准备给更高一位用。
第 0 位处理完毕(标灰),指针 i 右移一格去看第 1 位。
指针 i 走到第 1 位,这一位是 1。是 1,说明 x 的这一档(base)要算进答案。
这一位是 1:把当前档 base=4 乘进结果,result 从 2 变成 8。
不管这一位是几,扫完都把 base 自乘平方:base 从 4 升到 16,准备给更高一位用。
第 1 位处理完毕(标灰),指针 i 右移一格去看第 2 位。
指针 i 走到第 2 位,这一位是 0。是 0,说明这一档跳过,result 暂时不动。
这一位是 0:什么都不乘,result 原样保留 8(标红的就是这个被跳过的 0)。
不管这一位是几,扫完都把 base 自乘平方:base 从 16 升到 256,准备给更高一位用。
第 2 位处理完毕(标灰),指针 i 右移一格去看第 3 位。
指针 i 走到第 3 位,这一位是 1。是 1,说明 x 的这一档(base)要算进答案。
这一位是 1:把当前档 base=256 乘进结果,result 从 8 变成 2048。
不管这一位是几,扫完都把 base 自乘平方:base 从 256 升到 65536,准备给更高一位用。
第 3 位是最高位,处理完它,整个二进制就扫完了。
四位全部扫完。所有「位是 1」的档(高亮处)都乘进了 result,最终 2^11 = 2048,这就是答案。
三个高频追问:复杂度怎么来、n=0 边界、递归与迭代的取舍。
参考代码
def myPow(x, n): if n < 0: # 负指数:取倒数、指数变正 x, n = 1 / x, -n result = 1.0 base = x while n > 0: if n & 1: # 当前最低位是 1 result *= base # 把这一档乘进答案 base *= base # 升到下一档 x→x²→x⁴… n >>= 1 # 右移,看下一位 return result复杂度
- 时间:O(log n),n 的二进制有约 log₂n 位,每位只做一次乘法,循环 log₂n 趟
- 空间:O(1),只用 result 和 base 两个变量,不开额外数组、不递归占栈
易错点
面试追问把动画讲成自己的话
追问快速幂为什么是 O(log n)?
追问n = 0 时结果是多少?
追问递归版和迭代版有什么区别?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
字符串相乘
LeetCode 43 · 中等 · 沿着 数学 & 几何 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题