LeetCode 50 Pow(x, n)[快速幂 递归 迭代] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

以上是关于LeetCode 50 Pow(x, n)[快速幂 递归 迭代] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode50. Pow(x, n)(快速幂)

LeetCode50. Pow(x, n)(快速幂)

LeetCode 50. Pow(x, n)(快速幂,Java)

LeetCode 50 Pow(x, n)[快速幂 递归 迭代] HERODING的LeetCode之路

LeetCode50 Pow(x, n)

LeetCode数学系列——快速幂算法(50题)