Pow(x, n)
实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。
示例 1:
输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3
输出:9.26100
示例 3:
输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
解题思路
快速幂算法的基本思想是利用幂的二分性质,将幂次分解成较小的幂次,减少乘法次数。
- 如果n 是偶数,则 xn=(x(n/2))^2 ^次方
- 如果 n 是奇数,则 x^n =x × x^(n-1)
- 通过递归或迭代的方法,可以快速地计算x 的n 次幂。
Java实现
public class Power {
public double myPow(double x, int n) {
if (n == 0) {
return 1.0;
}
long N = n; // 使用 long 类型避免 n 取最小值时溢出
//如果 n 为负数,将 x 转换为 1/x,并将n 转换为正数。
if (N < 0) {
x = 1 / x;
N = -N;
}
double result = 1.0;
while (N > 0) {// 当 n 不为 0 时
//如果 n 是奇数,将当前的 x 乘到结果上。
if (N % 2 == 1) {
//奇数 x^n =x × x^(n-1) ->(n-1)变成偶数
//走下面的偶数逻辑(变成(n-1)/2,不变直接n/2也可以,结果是等价的)
result *= x;
}
//偶数 x^n=(x^(n/2))^2 -->(x^2)^(n/2)
//将 x 平方,n 减半。
x *= x;
N /= 2;
}
return result;
}
// 测试用例
public static void main(String[] args) {
Power solution = new Power();
System.out.println(solution.myPow(2.0, 10)); // 期望输出: 1024.0
System.out.println(solution.myPow(2.1, 3)); // 期望输出: 9.261
System.out.println(solution.myPow(2.0, -2)); // 期望输出: 0.25
}
}
时间空间复杂度
- 时间复杂度:O(log n),因为每次操作将 n 减半。
- 空间复杂度:O(1),只使用了常数级别的额外空间。