传送门:powx-n
题目描述
实现 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 位有符号整数,其数值范围是 [−2 ^31, 2 ^31 − 1] 。
代码
核心代码其实不多,主要就是针对n为奇数或偶数执行不同的操作。n为偶数时采用二分法的思想,使得时间复杂度控制在对数级,否则面对一些较大用例时存在超时情况。
package pid50;
public class Solution {
public static double myPow(double x,int n){
if(x<0){
if(n%2==0){
return myPow(-x,n);
}else{
return -myPow(-x,n);
}
}
if(n == 0){
return 1;
}else if(n < 0){
if(n == -2147483648){
n = 2147483647;//防止溢出,只能这样,改用long将不符合函数声明
}else{
n = -n;
}
return 1/myPow(x,n);
}else{
//n>0
if(n%2==0){
//这一步是解决超时的核心,n/2,每次将减少一半的遍历量
//对于用例0.00001^2147483647,时间复杂度是log2(n)
return myPow(x*x,n/2);
}else{
return x*myPow(x,n-1);
}
}
}
public static void main(String[] args) {
double res = myPow(-0.00001,-2147483648);
System.out.println(res);
}
}