题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方
思路1 递归+动态规划
代码没有优化,看着有点臃肿= =//,49ms的时间还是有点长,而且复杂度在O(n),显然不是最佳算法,思考快速幂的方法。
这里就分 指数<0 =0 >0三种情况 还有 0^0=1,0^n=0(n>0)
public class Solution {
public double Power(double base, int exponent) {
double tem=1.0;
if(exponent<0)
{
double[] arr=new double[-exponent];
for(int i=0;i<-exponent;i++)
{
if(i==0)
arr[i]=base;
else
arr[i]= arr[i-1]*base;
}
return 1/arr[-exponent-1];
}
else if(exponent==0)
return 1.0;
else
{
double[] arr=new double[exponent];
for(int i=0;i<exponent;i++)
{
if(i==0)
arr[i]=base;
else
arr[i]= arr[i-1]*base;
}
return arr[exponent-1];
}
}
}
思路2 快速幂
快速幂算法是在o( logn )的时间内求得 a ^ b
核心思路:
b & 1 == 1时(b为奇数) a ^ b = ( a ^ ( b / 2 ) ) ^ 2 * a;
b & 1 == 0时(b为奇偶数) a ^ b = ( a ^ ( b / 2 ) ) ^ 2;
ab = (a2)b/2 , b为偶数
ab = (a2)b/2·a , b为奇数
这个公式很简单,原理就是不断的用a的平方来代替b,将b替换为原来的一半。
public class Solution {
public double Power(double base, int exponent) {
double temp=1.0;
int index=0;
if(exponent>0)
index=exponent;
else if(exponent==0)
return 1.0;
else if(exponent<0)
if(base==0)
throw new RuntimeException("分母不能为0");
else
index=-exponent;
while(index!=0)
{
if((index&1)==1)
temp=temp*base;
base=base*base;
//index为101,右移1位为10。
index >>= 1;
}
return exponent>0?temp:1/temp;
}
}