「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」。
前言
实现 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 位有符号整数,其数值范围是 [−231, 231 − 1] 。
解题思路
这道题是让我们实现数学函数幂,因此直接调用系统内置函数是不被允许的。
符合直觉的做法是将x乘以n次,这种做法的时间复杂度是O(N)O(N)。
经实际测试,这种做法果然超时了。测试用例通过 291/304,在 0.00001\n2147483647这个测试用例挂掉了。如果是面试,这个解法可以作为一种兜底解法。
解题思路2
首先我们要知道:
如果想要求 x ^ 4,那么我们可以求 (x^2)^2 如果是奇数,会有一点不同。 比如 x ^ 5 就等价于 x * (x^2)^2。 当然 x ^ 5 可以等价于 (x ^ 2) ^ 2.5, 但是这不相当于直接调用了幂函数了么。对于整数,我们可以很方便的模拟,但是小数就不方便了。
我们的思路就是:
将 n 地板除 2,我们不妨设结果为 a 那么 myPow(x, n) 就等价于 myPow(x, a) * myPow(x, n - a) 很可惜这种算法也会超时,原因在于重复计算会比较多,你可以试一下缓存一下计算看能不能通过。
如果你搞不清楚有哪些重复计算,建议画图理解一下。
private double departPow(double x, int n) {
if (n == 1) {
return x;
}
if (n == 0) {
return 1;
}
int half = n / 2;
double halfResult = departPow(x, half);
if (n % 2 == 0) {
return halfResult * halfResult;
} else {
return halfResult * halfResult * x;
}
}
总结
- 实际上就是不断的乘法,在代码层面表现就是递归 是最简单粗暴的。为了运行快速,我们针对特殊的情况进行特殊的处理,所以有上面两个针对0,1的处理