题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
内置函数
public class Solution {
public double Power(double base, int exponent) {
return Math.pow(base,exponent);
}
}
常规解法
public class Solution {
public double Power(double base, int exponent) {
if(base ==0 && exponent==1){
return 0;
}
else if(exponent<0){
exponent = -exponent;
return (double)1/count(base,exponent);
}
else
return count(base,exponent);
}
public double count(double m,int n){
double sum = 1;
for(int i=1;i<=n;i++){
sum = sum *m;
}
return sum;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
递归法1
public class Solution {
public double Power(double base, int exponent) {
if(exponent<0){
exponent = -exponent;
base = 1/base;
return count(base,exponent);
}
else
return count(base,exponent);
}
public double count(double m,int n){
if(n==0)
return 1;
if(n==1)
return m;
double result = count(m,n-1)*m;
return result;
}
}
递归法2-二分法
exponent 为偶数,递归为:count(m,n/2)*count(m,n/2)
exponent 为奇数,递归为:m*count(m,n/2)*count(m,n/2)
public class Solution {
public double Power(double base, int exponent) {
//负数时,将小数部分改为1/base
if(exponent<0){
exponent = -exponent;
base = 1/base;
return count(base,exponent);
}
else
return count(base,exponent);
}
public double count(double m,int n){
if(n==0)
return 1;
if(n==1)
return m;
double ab = count(m,n/2);
//注意
if(n%2==0)
return ab*ab;
else
return m*ab*ab;
}
}
时间复杂度是 O(logn)
由于采用递归结构,空间复杂度是 O(logn)
位运算
将指数部分,写为二进制数
如45 = 4(101) = 42(0) * 42(2) = 41 44
public class Solution {
public double Power(double base, int exponent) {
if(exponent == 0)
return 1;
if(exponent == 1)
return base;
if(exponent < 0){
base = 1/base;
exponent = -exponent;
}
double count = 0;
int n = 0;
int a = 1;
double result = 1;
while(exponent!=0){
if((exponent & a)!=0){
result = result * base;
}
base = base*base;
exponent = exponent>>1;
}
return result;
}
}