这里了解一下快速幂的概念:
幂计算的时候可以通过二分每次计算指数为一半的情况,例如
// 偶数情况 x^n = x^(n/2) * x^(n/2)
2^64 = 2^32 * 2^ 32
2^32 = 2^16 * 2^16
2^16 = 2^8 * 2^8
2^8 = 2^4 * 2^4
2^4 = 2^2 * 2^2
2^2 = 2^1 * 2^1
// 奇数情况 x^n = x^(n/2) * x^(n/2) * x
2^63 = 2^31 * 2^31 * 2
因此求取xn的时候可以递归分解为求取x(n/2)
思路
- 递归快速幂进行计算
class Solution {
public double myPow(double x, int n) {
if (n > Integer.MAX_VALUE || n < Integer.MIN_VALUE) return 0;
return n > 0 ? quickMul(x, n) : 1/quickMul(x, -n);
}
double quickMul(double x, int n) {
if (n ==0) return 1;
// 递归快速幂
double y = quickMul(x,n/2);
// 判断奇偶性
return (n&1) == 1 ? y*y*x:y*y;
}
}
Q.E.D.