【原理讲解】
快速幂算法是指计算xn的时候,将n写为二进制,比如n = 10 -> (1010)2;那么x10 = x8 * x2,不难发现这样x2是可以通过(x4)2 快速算出来的,而x4也可以通过x2 平方后得到,这意味着,只要我们在遍历n的二进制数的时候,顺便维护一个临时变量t,每次循环都让t自身平方,就可以得到遍历的对应位置的0或者1对应要乘的x的幂。
这样的好处是可以在O(logn)的时间内计算出xn,而不需要O(n)连乘x。
为什么是O(logn) ? 因为一个数n的二进制形式的串的长度是O(log2n)级别的。就好比127 = 1111 111,长度是7.
【练习】 leetcode 题号为50的Pow(x, n)。
【分析】先确定结果的符号,如果只有当x是负数,而且|n|为奇数的时候,结果才是负数; 然后n有可能是负数,所以先取绝对值处理,最后看要不要取倒数。
有几种特殊情况需要特判,x = 0的时候,返回0,n = 0的时候,返回1.
对于一般的情况使用快速幂即可,即把n(假设是正整数)看做二进制数,遍历它的每一位,如果是1,比如1010,从右往左数的第一个1,对应了2,此时你需要快速获得a2,第二个1,对应8,此时你需要快速获得a8,维护一个数,让自己一直随着遍历平方就好了。
- 注意,计算的时候x也要开abs。
- 函数的入参n要开long long,否则取绝对值之后int放不下。
欢迎大家跟进我的刷题进度,一起进步,持续更新【每日算法】。
leetcode主页:我的leetcode主页
2857

被折叠的 条评论
为什么被折叠?



