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

  • 相关阅读:
    四种访问修饰符详解(推荐)
    三层架构中DAL层Sqlhelper怎样快速掌握?(常用)
    ASP.NET中最常用的验证控件使用方法(推荐)
    .NetFrom验证方便的webconfig 配置及前台使用(推荐)
    CefSharp访问需要认证网页或接口(在Request的Headers中添加认证Token)
    CentOS7中配置vsftpd
    CentOS7下安装RabbitMQ
    CentOS7下让Asp.Net Core的网站自动运行
    Winform下的Combox根据值来选中项
    golang简单实现jwt验证(beego、xorm、jwt)
  • 原文地址:https://www.cnblogs.com/wujunjie/p/5660881.html
Copyright © 2011-2022 走看看