力扣50、Pow(x,n)

1、直接循环求(超时)

 1 double myPow(double x, int n) {
 2         if(n==0||x==1)
 3         return 1;
 4         double temp=x;
 5         if(n<0){
 6             x=1/x;
 7             temp=x;
 8             n*=-1;
 9         }
10         while(--n>0)
11         x*=temp;
12         return x;
13     }

2、递归处理(4ms,34%;5.9MB,54%)

时间复杂度O(log n):递归层数

空间复杂度O(log n):递归层数

 1 class Solution {
 2 public:
 3     double myPow(double x, int n) {
 4         if(x==1||n==0)
 5         return 1;
 6         return n>0? recurPow(x,n):1.0/recurPow(x,n);
 7     }
 8     double recurPow(double x,int n){
 9         if(n==0)
10         return 1.0;
11         //直接定位到n最小的时候,y代表的是过去的数据
12         double y=recurPow(x,n/2);
13         //这个是通过判断现在数据的n的奇偶,从而用过去的数据得到现在的数据
14         //例如现在的n是1,y也是1,通过y*y*x可得现在的数据,即由x^0->x^1
15         //例如现在的n是2,y是x,通过y*y可得现在的数据,即由x^1->x^2
16         return n%2==0? y*y:y*y*x;
17     }
18 };

3、利用二进制规律求解(0ms,100%;5.6MB,100%)

时间复杂度:O(log n):即while()的执行次数

空间复杂度:O(1)

 1 class Solution {
 2 public:
 3     double myPow(double x, int n) {
 4         //这里用long是因为当n取-2^31时,-n反转即得到了2^31
 5         //但int的表示范围是-2^31~2^31-1,所以上面的反转会溢出
 6         long N=n;
 7         if(x==1||n==0)
 8         return 1;
 9         return N>0? binaryPow(x,N):1.0/binaryPow(x,-N);
10     }
11     //x^n刚好等于x^(n的二进制的1对应的十进制)的总和
12     //如x^10等于x^(2^3+2^1)等于(x^8*x^2),其中3和1分别对应10的二进制中的1
13     double binaryPow(double x,long n){
14         //sum保存目标值,num保存x^(n的二进制的1对应的十进制)
15         double sum=1;
16         double num=x;
17         while(n!=0){
18             if(n%2==1){
19                 sum*=num;
20             }
21             num*=num;
22             n/=2;
23         }
24         return sum;
25     }
26 };

 

上一篇:vue过渡动画和使用animate.css


下一篇:transition和transform