50. Pow(x, n)

184 阅读1分钟

方法一:快速幂 + 递归 TC:O(logN) SC:O(logN)

思路:

注意:

当n<0时,不能直接 return 1 / myPow(x, -n),当n为-2147483648直接取相反数会越界。

class Solution {
    public double myPow(double x, int n) {
        if (n < 0) {
            return 1 / (myPow(x, -n - 1) * x);//n = -2147483648直接取相反数会越界
        }
        if (n == 0) {//特殊情况
            return 1;
        }
        if (n == 1) {//终止条件
            return x;
        }
        double y = myPow(x, n / 2); //递归结果
        //如果当前n是偶数,直接把下一层平方;如果当前n是奇数,把下一层平方后再*x
        double res = n % 2 == 0 ? y * y : y * y * x;
        return res;
    }
}	

方法二:快速幂 + 迭代 TC:O(logN) SC:O(1)

规律:

n的二进制中,各个为1的位上表示的x的幂的乘积构成了x的n次幂。因此,只需找到n的二进制数中的为1的位,并把它们对应的十进制的x的幂相乘即可。

class Solution{
    public double myPow(double x, int n) {
        if (n < 0) {
            return 1 / (myPow(x, -n - 1) * x);
        }
        double res = 1;
        while (n > 0) {
            if (n % 2 == 1) {//找到了为1的位
                res *= x;
            }
            x *= x;
            n /= 2;//n的二进制数,每次右移一位
        }
        return res;
    }
}