LeetCode 50. Pow(x, n) (快速幂 递归+迭代)

1.题目

实现 pow(x, n) ,即计算 x 的 n 次幂函数。

示例 1:

输入: 2.00000, 10
输出: 1024.00000
示例 2:

输入: 2.10000, 3
输出: 9.26100
示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:

-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [231, 2311]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/powx-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2.题解

再求x的n次幂是,快速的做法不知for循环迭代n次,我们利用二分的思想。
使得每次的结果离最终结果迭代一半,这样就可以在log2n的时间复杂度得带结果。
从前往后想不太好理解,我们倒推,每次计算x 的⌊n/2⌋幂,递归终止条件为当n等于0时,结果唯一。

n为负数的时候

x的n次幂,就相当于x分之一的-n次幂.

递归
class Solution
{
public:
    double myPow(double x, int n)
    {
        long long N = n;
        return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
    }
    double quickMul(double x,long long N)
    {
        if(N == 0) return 1.0;
        double y = quickMul(x, N / 2);
        return N % 2 == 0 ? y * y : y * y * x;
    }
};

迭代

迭代的方法就直接参考官方题解吧,对于快速幂与二进制之间的关系,实在是想不到啊。
在这里插入图片描述
对于我们要求的n次幂,将n展开成二进制各位相乘的形式,n的二进制有多少位几次就能求出结果。

class Solution
{
public:
    double myPow(double x, int n)
    {
        if(x == 1 || n == 0) return 1;
        double ans = 1;
        long long num = n;
        if(n < 0)
        {
            num = -num;
            x = 1/x;
        }
        while(num)
        {
            if(num & 1) ans *= x;
            x *= x;
            num >>= 1;
        }
        return ans;
    }
};

你可能感兴趣的:(#,LeetCode,OJ)