力扣题目
解题思路
java代码
力扣题目:
实现 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
提示:
-100.0 < x < 100.0
-231 <= n <= 231-1
n
是一个整数- 要么
x
不为零,要么n > 0
。 -104 <= xn <= 104
解题思路:
算法原理:
这道题使用了分治法来计算一个数的幂次方。通过将幂次 N
不断地折半,来降低计算的复杂度。
思路:
- 在
myPow
方法中,首先将整数n
转换为长整数N
,然后根据N
的正负来决定是直接计算还是取倒数。 quickMul
方法用于计算正数幂次的情况。如果N
为 0 ,则返回 1 。否则,先计算N/2
次幂的结果y
,如果N
是偶数,结果就是y
的平方;如果N
是奇数,结果就是y
的平方再乘以x
。
代码分析:
myPow
方法主要是对输入的幂次进行处理和调用quickMul
方法。quickMul
方法通过递归和对幂次的奇偶判断来逐步计算幂次方。
时间复杂度:,因为每次递归都将幂次折半。
空间复杂度:,递归调用栈深度最大为 。
java代码:
package org.example;
public class Leetcode5 {
public static void main(String[] args) {
System.out.println(new Leetcode5().myPow(2.00000, 10));
}
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;
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项