update 50

This commit is contained in:
ShusenTang 2020-01-31 13:41:36 +08:00
parent 7d023fb6a5
commit ff4cfc6a55

View File

@ -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: