高效解法:
下面的讨论中 x 代表 base,n 代表 exponent。
因为 (x*x)n/2 可以通过递归求解,并且每次递归 n 都减小一半,因此整个算法的时间复杂度为 O(logN)。
比如:我们的目标是求出一个数字的32次方,如果我们已经知道了它的16次方,那么只要16次放的基础上再平方一次就可以了。而16次方又是8次方的平方。这样以此类推,我们求32次方只需要5次乘方:先求平方,在平方的基础上求4次方,在4次方的基础上求8次方,在8次方的基础上求16次方,最后在16此方的基础上求32次方。
public class Solution {
public double Power(double base, int exponent) {
if(exponent == 0)
return 1;
if(exponent == 1)
return base;
boolean isNegative = false;
if(exponent < 0){
exponent = -exponent;
isNegative = true;
}
double result = Power(base*base, exponent>>1);
if((exponent & 0x1) == 1){
result = result * base;
}
return isNegative ? 1/result : result;
}
}
PS:最后,除以2可以用位运算右移代替,判断奇偶可以用(exponent & 0x1)