From ff4cfc6a55956fe29981f507f6530b53ad5791cf Mon Sep 17 00:00:00 2001 From: ShusenTang Date: Fri, 31 Jan 2020 13:41:36 +0800 Subject: [PATCH] update 50 --- solutions/50. Pow(x, n).md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/solutions/50. Pow(x, n).md b/solutions/50. Pow(x, n).md index 5487a05..11068a3 100644 --- a/solutions/50. Pow(x, n).md +++ b/solutions/50. Pow(x, n).md @@ -3,7 +3,11 @@ 实现pow函数。 最先想到的就是用一个循环不断累乘x,实验发现果然超时了。 更快的方法就是二分,例如要求`pow(x, 4)`,如果按照刚刚超时的思路的话需要进行3次乘法,但是我们可以先算出`res = pow(x, 2)`,这一步需要1次乘法,然后再 -计算出`pow(x, 4) = res * res`即可得到最终结果,这一步需要1次乘法,总共需要2次乘法,比暴力算法少1次乘法,所以更快。如果n很大的话,这个速度优势就很明显了。 +计算出`pow(x, 4) = res * res`即可得到最终结果,这一步需要1次乘法,总共需要2次乘法,比暴力算法少1次乘法,所以更快。如果n很大的话,这个速度优势就很明显了。即, + +* n为正偶数:A^n = A^(n/2) * A^(n/2) +* n为正奇数:A^n = A^(n/2) * A^(n/2) * A + 根据上面的思路就可以写代码了,需要注意的是n可能为负数,为了统一我们可以先对n取绝对值,然后再用一个helper函数实现上述二分求幂的递归过程。 时间复杂度O(logn) @@ -17,9 +21,9 @@ class Solution { private: double helper(double x, long long n){ if(n == 1) return x; - double res = helper(x, n / 2); + double res = helper(x, n >> 1); res *= res; - if(n % 2) res *= x; + if(n & 1) res *= x; return res; } public: