leetcode|Pow(x,n)解题笔记
Implement pow(x, n).
题目:求x的n次方
public class Solution {
public double myPow(double x ,int n){
}
}
解题感受:这道题目在leetcode上的Difficulty是Medium,其实也不比Easy难多少,除了循环之外有几种解法:
一,作弊~直接Math.pow(x,n),不过用前人已经实现的东西意义不大,对提高自己分析思维无任何意义;
二,第一映像应该是n次递归相乘,时间复杂度O(n)
public double myPow(double x ,int n){
if(n==0){//递归出口
return 1.0;
}
if(n>0){//n为正
return x*myPow(x,n-1);
}else{//n为负
x = 1/x;
if(n == Integer.MIN_VALUE){//注意int边界的处理
return x*myPow(x,-Integer.MAX_VALUE);
}
return myPow(x,-n-1);
}
}
三,写到这里,本来我想也就这样了,后来leetcode在submit的时候搞出了一个Time Limit Exceeded的错误,我用水得不能再水的CET水平理解半天,它这是嫌我慢,超时了,怎么办,改呗,用时过长,无非我们就从缩短递归次数开始,于是我们可以将n分为奇偶,时间复杂度为O(logn),最后Accepted的代码如下,
public double myPow(double x ,int n){
if(n == 0){
return 1;
}
if(n<0){
x = 1/x;
if(n == Integer.MIN_VALUE){
return myPow(x,Integer.MAX_VALUE)*x;
}else{
return myPow(x,-n);
}
}
double half = myPow(x,n>>1);
if(n%2==0){
return half*half;
}else{
return x*half*half;
}
}
最后。。。。。有个小问题,得出上面的代码之前,我写的是这样:
public double myPow(double x ,int n){
if(n == 0){
return 1;
}
if(n<0){
x = 1/x;
if(n == Integer.MIN_VALUE){
return myPow(x,Integer.MAX_VALUE)*x;
}else{
return myPow(x,-n);
}
}
if(n%2==0){
return myPow(myPow(x,n>>1),2);
}else{
return x*myPow(myPow(x,n>>1),2);
}
}
以上代码在IDE是执行是没有问题的,可不知为啥Accept的时候搞出了 java.lang.StackOverflowError...请各位同仁指教一番这个现象!