解题思路
普通for循环持续乘上去,时间复杂度是O(n)
可以用分治思想的快速幂来让时间复杂度降到O(logn)
如图可以通过二分,将幂折半,另一半直接与底数做算数,如果幂是奇数,则还需要补一个底数相乘。
如何实现
代码如下
递归分治
class Solution {
public double myPow(double x, int n) {
if (n < 0) {
return 1.0 / myPowRecursion(x, -n);
} else {
return myPowRecursion(x, n);
}
}
public double myPowRecursion(double x, int n) {
if (n == 0) {
return 1.0;
}
double half = myPowRecursion(x, n / 2);
if (n % 2 == 0) {
return half * half;
} else {
return half * half * x;
}
}
}
迭代快速幂
class Solution {
public double myPow(double x, int n) {
if (x == 0) {
return 0;
}
long N = n; // int[−2147483648,2147483647],n为int_min时会溢出
double res = 1;
if (N < 0) {
x = 1 / x;
N = -N;
}
while (N > 0) {
if ((N & 1) == 1) {
res *= x;// 如果是奇数,则结果还需要补一个底数相乘
}
x *= x; // 折半后底数取平方数
N >>= 1; // 幂折半
}
return res;
}
public static void main(String[] args) {
Solution k = new Solution();
System.out.println(k.myPow(2, -2));
}
}