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.0System.out.println(solution.myPow(2.1, 3)); // 期望输出: 9.261System.out.println(solution.myPow(2.0, -2)); // 期望输出: 0.25}
}
时间空间复杂度
- 时间复杂度:O(log n),因为每次操作将 n 减半。
- 空间复杂度:O(1),只使用了常数级别的额外空间。