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)