实现 pow(x,n)
注意事项
不用担心精度,当答案和标准输出差绝对值小于1e-3
时都算正确
Pow(2.1, 3) = 9.261 Pow(0, 1) = 0
Pow(1, 0) = 1
/** 暴力很简单就可以实现,算法的复杂度是O(N),那么有什么办法可以优化呢,现在是O(N),那么就要朝着O(logN)的方向进行优化,以25为例X^25,可以先考虑X^1, X^2 ,X^4, X^8, X^16,然而还差X^9,同理我们将9分解为X^1, X^2 ,X^4, X^8,余下的就是X^1,将每个步骤的最大次方提取出来就是X^16,X^8,X^1,其实就是将25分解成16,8,1也就是25的二进制表示11001。把25分解后如何处理呢,遍历25的每一位i,如果是1,那么result *= X(2^i),最后也就求出X^25 = X^1 * X^8 *X^16。 1)最直观容易想到的方法就是用递归方法求n个x的乘积,注意考虑n的正负号,时间复杂度为O(n) 2)考虑到n个x相乘式子的对称关系,可以对上述方法进行改进,从而得到一种时间复杂度为O(logn)的方法,递归关系可以表示为pow(x,n) = pow(x,n/2)*pow(x,n-n/2) //下面使用二分法求解,不过因为两个的子解是一样的, //所以可以只求一边解就可以了,这就是最典型的减治法了。 *///博客 public class Solution { public double myPow(double x, int n) { if (n == 0) return 1; if (n == 1) return x; //用于判断正负 boolean flag = false; if (n < 0) { flag = true; n *= -1; } //递归关系可以表示为pow(x,n) = pow(x,n/2)*pow(x,n-n/2) int k = n / 2;//4/2=2 2/2=1 int l = n - k * 2;//4-4=0 0 double t1 = myPow(x, k);// double t2 = myPow(x, l); if (flag == true) { return 1/(t1*t1*t2); } else { return t1*t1*t2; } } }