Pow(x, n)
Implement pow(x, n).
Solution1
- 最简单的方法当然就是按照幂运算的规则一个一个去乘方了。如下:
public class Solution {
public double myPow(double x, int n) {
if(x>-0.000001&&x<0.000001) return 0;
if(n==0) return 1;
boolean flag = n>0?true:false;
n = (n>0?n:-1*n);
double res = 1;
while(n-->0) res *= x;
return flag?res:1/res;
}
}
Solution2
- 解法一可行,但是OJ时报超时错误。时间复杂度还可以做得更好一些。
public class Solution {
public double myPow(double x, int n) {
if(x>-0.000001&&x<0.000001) return 0;
if(n==0) return 1;
boolean flag = n>0?true:false;
n = (n>0?n:-1*n);
double t = myPow(x,n/2);
if((n&1)==0) t *= t;
else t = t*t*x;
return flag?t:1/t;
}
}
- 这样的时间复杂度为 O(logN) .
Solution3
- 另外观察到负数在求模的过程中的特点:-5/2=-2; -4/2=-2; -3/2=-1; 可以进一步将解法二的代码简化如下:
public class Solution {
public double myPow(double x, int n) {
if(n==0) return 1;
if(x==0) return 0;
double t = myPow(x,n/2);
if((n&1)==0) return t*t;//必定是正数且为偶数
else return n<0?(1/x*t*t):(x*t*t);//注意不是1/(x*t*t)
}
}