题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
解题思路
方法一:直接法
1、思路:直接一个for循环求幂次方。
2、代码:
class Solution {
public:
double Power(double base, int exponent) {
if (base == 0) return 0;
if (exponent == 0) return 1;
if (exponent < 0) {
base = 1 / base;
exponent = -exponent;
}
double sum = 1;
for (int i = 0; i < exponent; i++) {
sum = sum * base;
}
return sum;
}
};
3、复杂度:
时间复杂度:O(n);
空间复杂度:O(1)。
方法二:快速幂
1、思路:遍历幂次方的二进制位,为1则将base乘进sum中,幂次方每右移一位,base变成自己的平方。
2、代码:
class Solution {
public:
double Power(double base, int exponent) {
if (base == 0) return 0;
if (exponent == 0) return 1;
if (exponent < 0) {
base = 1 / base;
exponent = -exponent;
}
double sum = 1;
while (exponent) {
if (exponent & 1) {
sum = sum * base;
}
base = base * base;
exponent = exponent >> 1;
}
return sum;
}
};
3、复杂度:
时间复杂度:O(),其中n为幂次方;
空间复杂度:O(1)。
方法三:快速幂递归版
1、思路:把该数的幂次方变成该数的幂次方的一半的平方,然后递归求解,当幂次方为奇数时需要特殊处理一下。
2、代码:
class Solution {
public:
double rPower(double base, int exponent) {
if (exponent == 0) return 1;
double ret = rPower(base, exponent/2);
if (exponent & 1)
return ret * ret * base;
return ret * ret;
}
double Power(double base, int exponent) {
if (base == 0) return 0;
if (exponent < 0) {
base = 1 / base;
exponent = -exponent;
}
return rPower(base, exponent);
}
};
3、复杂度:
时间复杂度:O();
空间复杂度:O()。