随便看的题目
50. Pow(x, n)
实现 pow(x, n) ,即计算 x
的 n
次幂函数(即,$x^n$ )。
pow(x,n)用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #include <iostream> #include <cstddef> #include <cmath> #include <valarray>
using namespace std;
int main () { valarray<double> val (5); valarray<double> results;
for (int i=0; i<5; ++i) val[i]=i+1; cout << "val:"; for (size_t i=0; i<val.size(); ++i) cout << ' ' << val[i]; cout << '\n'; results = pow (val,val); cout << "val^val:"; for (size_t i=0; i<results.size(); ++i) cout << ' ' << results[i]; cout << '\n';
results = pow (val,2.0); cout << "val^2:"; for (size_t i=0; i<results.size(); ++i) cout << ' ' << results[i]; cout << '\n';
results = std::pow (2.0,val); cout << "2^val:"; for (size_t i=0; i<results.size(); ++i) cout << ' ' << results[i]; cout << '\n';
return 0; }
|
暴力解法——连乘法
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Solution { public: double myPow(double x, int n) { if(n < 0){ n = -n; x = 1/x; } double ans = 1.0; for(int i = 0;i < N;++i) ans *= x; return ans; } };
|
时间复杂度:$O(n)$
空间复杂度:$O(n)$
调库函数
1 2 3 4 5 6
| class Solution { public: double myPow(double x, int n) { return pow(x,n); } };
|
题解快速幂
分治法
- 边界条件
n==0
,返回1 - 当前步计算 $y= x^{\lfloor \frac{n}{2} \rfloor}$ ,即上一步的平方
- 若是偶数,则进入下一层
- 若是奇数,y*=x,进入下一层
注意:
若n是负数,则最后返回倒数
1. 递归
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution { public: double mul(double x,int n){ if(n == 0) return 1.0; double y = 1.0; if(n & 1){ y = x; } return y * pow(mul(x,n/2),2); }
double myPow(double x, int n) { return n >=0 ? mul(x,n) : 1/mul(x,n); } };
|
时间复杂度:$O(logn)$ 递归层数
空间复杂度:$O(logn)$