1. 题目链接
2. 题目大意
描述:给定浮点数 x 和整数 n。
要求:计算 x 的 n 次方(即 xn)。
说明:
- −100.0<x<100.0。
- −231≤n≤231−。
- n 是一个整数。
- −104≤xn≤104。
3. 示例
输入:x = 2.00000, n = 10
输出:1024.00000
输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
4. 解题思路
常规方法是直接将 x 累乘 n 次得出结果,时间复杂度为 O(n)。
我们可以利用分治算法来减少时间复杂度。
根据 n 的奇偶性,我们可以得到以下结论:
- 如果 n 为偶数,xn=xn/2×xn/2。
- 如果 n 为奇数,xn=x×x(n−1)/2×x(n−1)/2。
x(n/2) 或 x(n−1)/2 又可以继续向下递归划分。
则我们可以利用低纬度的幂计算结果,来得到高纬度的幂计算结果。
这样递归求解,时间复杂度为 O(logn),并且递归也可以转为递推来做。
需要注意如果 n 为负数,可以转换为 1x(−n)。
5. 参考代码
class Solution {
public double myPow(double x, int N) {
double ans = 1;
long n = N;
if (n < 0) {
n = -n;
x = 1 / x;
}
while (n != 0) { // 从低到高枚举 n 的每个比特位
if ((n & 1) == 1) { // 这个比特位是 1
ans *= x; // 把 x 乘到 ans 中
}
x *= x; // x 自身平方
n >>= 1; // 继续枚举下一个比特位
}
return ans;
}
}