实现 pow(x, n) ,即计算 x 的 n 次幂函数。
我的思路就是简单的累乘n次x,代码如下:
class Solution {
public double myPow(double x, int n) {
double result = 1.00000;
int num = Math.abs(n);
for(int i = 0;i < num;i++){
result = result * x;
}
if(n < 0){
result = 1/result;
}
return result;
}
}
显然问题就是超出时间限制
所以官方这里给出了一个快速幂(分治法)的算法:
当n为偶数时,x^n=(x^n/2)*(x^n/2)
当n为奇数时,x^n=(x^n/2)*(x^n/2)*x
代码如下:
class Solution {
public double myPow(double x, int n) {
long N = n;
return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
}
public double quickMul(double x, long N) {
if (N == 0) {
return 1.0;
}
double y = quickMul(x, N / 2);
return N % 2 == 0 ? y * y : y * y * x;
}
}
由于递归需要使用额外的栈空间,可以将递归转写为迭代。
这个思路类似于找规律,一般很难短时间内想到,代码如下:
class Solution {
public double myPow(double x, int n) {
long N = n;
return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
}
public double quickMul(double x, long N) {
double ans = 1.0;
// 贡献的初始值为 x
double x_contribute = x;
// 在对 N 进行二进制拆分的同时计算答案
while (N > 0) {
if (N % 2 == 1) {
// 如果 N 二进制表示的最低位为 1,那么需要计入贡献
ans *= x_contribute;
}
// 将贡献不断地平方
x_contribute *= x_contribute;
// 舍弃 N 二进制表示的最低位,这样我们每次只要判断最低位即可
N /= 2;
}
return ans;
}
}