题目描述:实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
-100.0 < x < 100.0
-231 <= n <= 231-1
-104 <= xn <= 104
思路:以2的10次方举例,
2的10次方 = 2的5次方*2的5次方
2的5次方 = 2的2次方*2的3次方
以此类推...
得到一个递归公式
2^n = 2^(n/2) + 2^(n-n/2)
为了让速度更快,对已经计算的结果做存放,下次直接拿,减少递归次数。
此外要注意 -2147483648,因为2^-2 = 1/2^2,所以会出现int型越界。
class Solution {
Map<Integer, Double> cache = new HashMap<Integer, Double>();
public double myPow(double x, int n) {
cache.clear();
if(n == 0)
return 1;
if(n == -2147483648) {
return 1 / (pow(x, 2147483647) * x);
}
if(n < 0)
return 1/pow(x, -n);
return pow(x, n);
}
private double pow(double x, int n) {
if (n == 1) {
return x;
}
double p1 = getPowData(x, n/2);
double p2 = getPowData(x, (n - n/2));
return p1 * p2;
}
private double getPowData(double x, int nextN) {
if (cache.containsKey(nextN)) {
return cache.get(nextN).doubleValue();
} else {
double v = pow(x, nextN);
cache.put(nextN, v);
return v;
}
}
}
参考了别人写的精简代码,打算再改下自己的,其实不需要map的。
class Solution {
public double myPow(double x, int n) {
if(n == 0)
return 1;
if(n == -2147483648) {
return 1 / (pow(x, 2147483647) * x);
}
if(n < 0)
return 1/pow(x, -n);
return pow(x, n);
}
private double pow(double x, int n) {
if (n == 1) {
return x;
}
double powValue = pow(x, n/2);
if(n %2 == 0) {
return powValue * powValue;
}
return powValue * powValue * x;
}
}