zoukankan      html  css  js  c++  java
  • 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...请各位同仁指教一番这个现象!

  • 相关阅读:
    Latex: 插入数学公式
    Matlab: 作图
    Random Access Iterator 2019 ICPC 徐州网络赛(树上概率DP)
    2019南京网络赛D Robots(概率DP+拓扑序)
    HDU3507 Print Article(斜率优化+单调队列)
    hdu4632(区间dp)
    POJ 1651 Multiplication Puzzle 区间DP
    暑假集训
    POJ-2955(区间DP)
    kuangbin计算几何模板转载
  • 原文地址:https://www.cnblogs.com/wujunjie/p/5660881.html
Copyright © 2011-2022 走看看