50. Pow(x, n)
实现 pow(x,n) ,即计算 x 的 n 次幂函数。
解题思路: 此题属于实现基本的函数库的函数,这类型题在面试的过程中会非常常见,除了此题,还有比如实现stoi()
函数。由于此题n的值非常大,因此不能用
O
(
n
)
O(n)
O(n)的时间复杂度解题。本质上此题在考察快速幂的解法。数学上我们有下面推论:
a
2
n
+
1
=
a
n
∗
a
n
∗
a
a^{2n+1} = a^n*a^n*a
a2n+1=an∗an∗a
a
2
n
=
a
n
∗
a
n
a^{2n} = a^n*a^n
a2n=an∗an
因此在计算出
a
n
a^n
an之后可以快速的计算出
a
2
∗
n
+
1
a^{2*n+1}
a2∗n+1和
a
2
∗
n
a^{2*n}
a2∗n,因此可以使算法的时间复杂度降为
O
(
l
o
g
N
)
O(logN)
O(logN),这个复杂度对于解决大数据量的题是最受欢迎的。OK,请看代码。
class Solution {
public:
double helper(double x, long n) {
if (n == 1) return x;
double t = helper(x, n / 2);
if (n & 1) return t * t * x;
else return t * t;
}
double myPow(double x, int n) {
if (n == 0) return 1.0;
int sign = (n > 0 ? 1 : -1);
long a = n;
a = labs(a);
return sign == 1 ? helper(x, a) : 1.0 / helper(x, a);
}
};