C++快速幂
📟作者主页:慢热的陕西人
🌴专栏链接:力扣刷题日记
📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言
题目描述
解题思路
借用递归的思路实现pow函数:
首先我们来举两个例子:
偶数:
2 16 2^{16}216—>2 8 2 ^ 828 * 2 8 2 ^ 828 | 2 8 2 ^ 828 —>2 4 2 ^ 424 * 2 4 2 ^ 424 | 2 4 2 ^ 424 —>2 2 2 ^ 222 * 2 2 2 ^ 222 | 2 2 2 ^ 222 —> 2 * 2
奇数:
2 21 2 ^{21}221—>2 10 2 ^ {10}210 * 2 10 2^{10}210 * 2 22 | 2 10 2 ^{10}210 —> 2 5 2 ^ {5}25 * 2 5 2 ^ 525 | 2 5 2 ^ 525 —> 2 2 2 ^ 222 * 2 2 2^222 * 2 | 2 2 2 ^ 222 —> 2 22 * 2 22;
从上面的例子我们也可以看出一个共同的子问题:
如果我们要计算x n x ^ nxn 那么我们先计算 x n / 2 x ^ {n / 2}xn/2, 通过这样的方法我们就可以将计算n次方的时间复杂度降到l o g 2 n log _2 ^ nlog2n
那么答题思路就是如上所示。
细节:
当n = − 2 31 -2 ^ {31}−231的时候我们将它转成正数会越界,所以我们在转化之前将它转成
longlong
即可解决;
代码
class Solution { public: double myPow(double x, int n) { return n < 0 ? 1.0 / pow(x, -(long long)n) : pow(x, n); } double pow(double x, long long n) { if(n == 0) return 1; double tmp = pow(x, n / 2); return n % 2 == 0 ? tmp * tmp : tmp * tmp * x; } };
复杂度分析
时间复杂度:
采用了快速幂的算法思路我们只需要O(l o g n log^nlogn)的复杂度即可解决问题;
空间复杂度:
每次递归中都声明了一个临时变量
tmp
,所以空间复杂度是O(l o g n log ^ nlogn);