一、题目描述
实现 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, 231 − 1] 。
二、思路及代码实现
快速幂 + 递归
本题的方法被称为快速幂算法。指数 n 为负数的结果可以由 n 为正数时的结果求得,即 x − n = 1 x n x ^{-n} = \frac{1}{x ^ n} x−n=xn1,因此我们只需要考虑 n 为自然数的情况。
我们用分治算法的思想,一般地,如果要计算 x n x ^ n xn, 我们可以先计算 y = x n 2 y = x ^ \frac{n}{2} y=x2n,再计算 y 2 y ^ 2 y2 就能得到结果。这样我们就能将大问题划为规模更小的问题去解决。
题目中 n 为整数,当 n 是奇数还是偶数的情况也有所不同。例如,计算 x 8 x ^ 8 x8 时,先计算出 y = x 4 y = x ^ 4 y=x4,再计算 y 2 y ^ 2 y2 即可;而计算 x 9 x ^ 9 x9 时,先计算出 y = x 4 y = x ^ 4 y=x4,再计算 y 2 × x y ^ 2 \times x y2×x 才能得到结果。由此,我们的算法实现为:
- 要计算 x n x ^ n xn 时,先递归地计算出 y = x ⌊ n / 2 ⌋ y = x ^ {\lfloor n / 2 \rfloor} y=x⌊n/2⌋( ⌊ a ⌋ \lfloor a \rfloor ⌊a⌋ 表示向下取整);
- 再根据计算的结果,如果 n 为偶数,则 x n = y 2 x ^ n = y ^ 2 xn=y2;如果 n 为奇数,则 x n = y 2 × x x ^ n = y ^ 2 \times x xn=y2×x;
- 递归结束条件:当 n = 0 时, x 0 = 1 x ^ 0 = 1 x0=1。
参考代码:
class Solution {
public double myPow(double x, int n) {
long N = n;
return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, N);
}
public double quickMul(double x, long N){
if(N == 0)
return 1.0;
double y = quickMul(x, N / 2);
return N % 2 == 0 ? y * y : y * y * x;
}
}