题目
实现 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/22 = 1/4 = 0.25
解题
解法一:暴力法。
求x的n次方,最简单的就是xxxx…*x(总共n个x相乘)。一个for循环就可以搞定,但是不出所望,这种方法果然超时。
解法二:递归。
主要思想是,当我们得知 x^2 时,我们要求x ^4就不必xxx*x来求,而是直接通过 x ^2 ·x ^2就可以求得x ^4。以此类推,我们通过x ^4能得到x ^8等。这就使时间复杂度降低到O(logn)。
在调用递归函数PowHalf之前,我们要先处理一下幂指数n。当n>0时,直接把x和n传递给递归函数;当n=0时,任何数(除0外,题目的测试用例应该也没有给0做底数)的0次幂都是1;当n<0时,x等于它的倒数,n取相反数,传递给递归函数。
递归函数中,n有3种情况:
1.n=0,递归的边界条件,此时返回1;
2.n是偶数,那么只需要temp*temp,例如【N^4】,等同于N ^2 * N ^2;
3.n是奇数,那么我们需要temp * temp * x,例如【N ^5】,
等同于N ^2 * N ^2 * N。
需要注意的点
在调用递归函数之前,先把幂指数的正负处理好。
public double MyPow(double x, int n) {
if(n<0){
x=1/x;
n=-n;
return PowHalf(x,n);
}
else{return PowHalf(x,n);}
}
public double PowHalf(double x,int n){
if(n==0){
return 1;
}
else if((n&1)==0){
double temp=PowHalf(x,n/2);
return temp*temp;
}
else{
double temp=PowHalf(x,n/2);
return temp*temp*x;
}
}
代码参考:https://leetcode-cn.com/problems/powx-n/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by–15/