题目描述:
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2^(-2) = 1/2^2 = 1/4 = 0.25
说明:
- -100.0 < x < 100.0
- n 是 32 位有符号整数,其数值范围是 [-, − 1] 。
思路:
这题最简单快速的方法当然是调用库函数了,不过显然不是题目所考察的点。
这题如果是没做过的话,感觉能做好也不容易,不过做过一遍之后基本上不会忘记了。这题正确的打开方式应该用快速幂,更准确地说应该是二分快速幂。
首先我们看一下我们平常算次方怎么算的,比如3的5次方,3 * 3 * 3 * 3 * 3 = 273, 做4次乘法就好了,好像也不是很复杂,但是如果算1.01的1亿次方呢?我们就要做1一次乘法,这种O(N)的复杂度显然还是不够友好。那么能不能简化操作呢?
还是看,其实可以写成,这样只做了3次乘法;如果是,做了7次乘法, 如果换成 ,这只做了3次乘法。结论来了,对于:
这就是快速幂的"快速"之处,对于每一次的,都可以通过计算(k为偶数)或者(k为奇数)得到,这样的话直接将O(N)的复杂度降为O(logN)。
代码:
class Solution {
public double myPow(double x, int n) {
double ans = 1, temp = x;
int flag = n;
while (flag != 0) {
if ((flag & 1) == 1) { // 判断flag二进制最后一位是否为1,比 if ((flag % 2) != 0)稍微快点
ans = ans * temp;
}
temp = temp * temp;
flag /= 2;
}
return n > 0 ? ans : 1 / ans;
}
}