方法一:快速幂 + 递归 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;
}
}