From f0e6ceac8c76947a5c8e67fae9a342fbc8c721a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E6=A0=91=E6=A3=AE?= Date: Tue, 15 Jan 2019 23:29:42 +0800 Subject: [PATCH] Create 50. Pow(x, n).md --- solutions/50. Pow(x, n).md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 solutions/50. Pow(x, n).md diff --git a/solutions/50. Pow(x, n).md b/solutions/50. Pow(x, n).md new file mode 100644 index 0000000..5487a05 --- /dev/null +++ b/solutions/50. Pow(x, n).md @@ -0,0 +1,35 @@ +# [50. Pow(x, n)](https://leetcode.com/problems/powx-n/) +# 思路 +实现pow函数。 +最先想到的就是用一个循环不断累乘x,实验发现果然超时了。 +更快的方法就是二分,例如要求`pow(x, 4)`,如果按照刚刚超时的思路的话需要进行3次乘法,但是我们可以先算出`res = pow(x, 2)`,这一步需要1次乘法,然后再 +计算出`pow(x, 4) = res * res`即可得到最终结果,这一步需要1次乘法,总共需要2次乘法,比暴力算法少1次乘法,所以更快。如果n很大的话,这个速度优势就很明显了。 +根据上面的思路就可以写代码了,需要注意的是n可能为负数,为了统一我们可以先对n取绝对值,然后再用一个helper函数实现上述二分求幂的递归过程。 + +时间复杂度O(logn) + +注意:对int型的最小的数−2^31取绝对值将会超出int型范围,所以要用long long型。 + + +# C++ +``` C++ +class Solution { +private: + double helper(double x, long long n){ + if(n == 1) return x; + double res = helper(x, n / 2); + res *= res; + if(n % 2) res *= x; + return res; + } +public: + double myPow(double x, int n){ + if(x == double(0.0)) return x; + if(n == 0) return double(1.0); + + double res = helper(x, abs(long(n))); // 必须先把n强转为long long型,这样abs才返回的long long型 + if(n > 0) return res; + return double(1.0) / res; + } +}; +```