由于n可以取到INT_MAX级别,暴力求解不太行。 考虑到 x^n = x^(n/2) * x^(n/2) * x^(n-n/2*2)。 使用递归求解,每次计算x^(n/2),并乘上额外的值。 对3个较为特殊的的取值,即0, 1, -1进行额外判断。
class Solution {
public:
unordered_map<int, double> record;
double _myPow(double x, int n) {
// if n == 0 || n == 1 || n == -1
if (record.count(n)) {
return record[n];
}
// calculate x^(n>>1)
int half = n >> 1;
double temp1 = myPow(x, half);
return temp1 * temp1 * record[n-half-half];
}
double myPow(double x, int n) {
// init value
record = {{0, 1}, {1, x}, {-1, 1/x}};
return _myPow(x, n);
}
};