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

  • 相关阅读:
    day1 instance,round,divmod,imput, 字符串
    Django中如何将javascript中的变量传给位于javascript内的{% url %}中的参数?
    demo_33 评论发布弹窗实现
    demo_32 富文本渲染
    demo_31 详情页面数据初始化
    demo_30 内容预加载
    demo_29 详情页页面展示
    demo_28 使用自定义事件同步数据
    demo_27 保存标签页数据
    demo_26 编辑标签页
  • 原文地址:https://www.cnblogs.com/wujunjie/p/5660881.html
Copyright © 2011-2022 走看看