题目链接
题目描述
给定一个 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)
