LeetCode 50 Pow(x, n)[快速幂 递归 迭代] HERODING的LeetCode之路
解题思路:
解决该题不能用常规的幂函数的思路,即 xn = x * x * x * … x,而是换一个思路,比如28,可以为24 * 2,24 也是同理,这样递归的方式实现,注意N可能为负数,所以在返回时要讨论,代码如下:
class Solution {
public:
double quickPow(double x, long long N) {
if(N == 0) {
return 1.0;
}
double y = quickPow(x, N / 2);
return N % 2 == 0 ? y * y : y * y * x;
}
double myPow(double x, int n) {
long long N = n;
return N >= 0 ? quickPow(x, N) : 1.0 / quickPow(x, -N);
}
};
迭代的方式也是相同的道理,并且不像递归的方式占用太多的栈空间,但是他不能像递归那样直接倒着来,即递归到N为0的时候才开始计算,迭代的方式是从N乘性减的时候就要进行计算了,所以要考虑奇数情况下x的贡献度,即多乘的x会在之后的迭代中不断翻倍,所以在迭代的时候也要翻倍,代码如下:
class Solution {
public:
double quickPow(double x, long long N) {
double ans = 1.0;
double contribute = x;
while(N > 0) {
if(N % 2 == 1) {
ans *= contribute;
}
contribute *= contribute;
N /= 2;
}
return ans;
}
double myPow(double x, int n) {
long long N = n;
return N >= 0 ? quickPow(x, N) : 1.0 / quickPow(x, -N);
}
};
时间复杂度:O(logn)
空间复杂度:O(1)