题目链接
题目描述
给定一个 double 类型的浮点数 base 和 int 类型的整数 exponent,求 base 的 exponent 次方。
解题思路
递归法
下面的讨论中 x 代表 base,n 代表 exponent。
因为 (x*x)n/2 可以通过递归求解,并且每次递归 n 都减小一半,因此整个算法的时间复杂度为 O(logN)。
class Solution {
public:
double q_power(double b, int n)
{
if(n == 0)
return 1;
double ret = q_power(b, n/2);
if(n % 2 ==1)
return ret * ret *b;
return ret * ret;
}
double Power(double base, int exponent) {
if(base == 0)
return 0;
if(exponent<0)//如果幂数为负
{
base = 1/base;
exponent = -exponent;
}
return q_power(base, exponent);
}
};
LeetCode解法:
class Solution {
public double myPow(double x, int n) {
long N = n;
if(N == 0){
return 1;
}
if(x == 0 || x == 1){
return x;
}
if(N < 0){
N = - N;
x = 1/x;
}
return Pow(x, N);
}
private double Pow(double x, long n){
if(n == 0){
return 1;
}
if(x == 0 || x == 1){
return x;
}
double res = Pow(x, n / 2);
if((n & 1) == 1){
return x * res * res;
}
return res * res;
}
}
- 时间复杂度: O(logN)。
非递归法:
假设求,已知6可以表示成二进制110可以表示成
,所以
可以表示成
所以,对于二进制数,遇到位数是1的就乘到答案中。 ```cpp class Solution { public:
double Power(double base, int exponent) {
if(exponent < 0)
{
base = 1/base;
exponent = -exponent;
}
double x = base;
double ret = 1.0;
while(exponent)
{
// exponent为奇数if判断会成立两次,第一次和最后一次
// exponent为偶数if判断会成立一次,最后一次
if(exponent&1) // 判断当前最后一位是否为1(是否为奇数)
{
ret *= x;
}
x *=x;//x不断翻倍
exponent >>=1;//右移,去掉最低位
}
return ret;
}
};
/// class Solution { public: double Power(double base, int exponent) { if(exponent==0) return 1; if(exponent==1) return base; if(base==0) return 0; if(exponent<0){ exponent = -exponent; base = 1/base; } double x = base; while(exponent>1){ x = x; exponent >>=1; } if(exponent&1) return xbase; return x; } }; ``` 上述方法相当于遍历n的二进制位,是1就乘进结果(如x的6次方,x为1次,2次,4次,当exponent&1为1时,即2次,4次,乘入x的2次,4次)。
- 时间复杂度:O(logn),因为n的二进制位个数为logn
- 空间复杂度:O(1)