leetcode|Pow(x,n)解题笔记

Implement pow(xn).

题目:求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...请各位同仁指教一番这个现象!

posted @ 2016-07-11 17:05  Roger's  阅读(576)  评论(0编辑  收藏  举报