[编程题] lc[70. 爬楼梯

[编程题] lc:70. 爬楼梯

题目描述

image-20200719003518528

输入输出例子

image-20200719003534078

方法1:普通递归

思想:化为子问题

Java代码

//方法1:普通递归
    public int climbStairs(int n) {
        if(n==1){return 1;}
        if(n==2){
            return 2;
        }else{
            return climbStairs(n-1)+climbStairs(n-2);
        }
    }

方法2:滑动数组(指针从左往右滑动)
思想:让三个指针p q r,构成滑动数组,不断从左往右滑动;其中p指向n=1情况的值的前一个节点,q指向n=1的情况,r指向n=2的情况
见图解:

 //方法2:滑动数组的方式(从左往右滑)
     public int climbStairs3(int n) {
         int p = 0;   //pre节点指针
         int q = 1;  //相当于n=1的情况的指针
         int r = 2;  //相当于n=2的情况的指针
         for(int i=1;i<n;i++){  //传入2,只需要移动1次,传入3,只需移动2次
             p = q;
             q = r;
             r = p+q;
         }
         return q;
    }

方法2:滑动数组(指针从右往左滑动)

思想:让三个指针p q r,构成滑动数组,不断从右往左滑动;

Java代码

//方法2:滚动数组
    public int climbStaires2(int n){
        int p,q=0;int r=1;
        for (int i = 0; i < n; i++) {
            p = q;
            q = r;
            r = p+q;
        }
        return r;
    }

方法4:满足斐波那契直接使用数学公式

公式:

image-20200719003821166

代码

//方法3:发现构造的这个数组符合斐波那契数列,直接用公式
    public static double climbStaires3(int n){
        int[] arr = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
        double sqrt = Math.sqrt(5);
        return (int)(1/sqrt *(Math.pow((1+sqrt)/2,n+1)-Math.pow((1-sqrt)/2,n+1)));
    }

方法4:动态规划

思想:

image-20200719003908500

代码

//方法2:动态规划(空间换时间)
     public int climbStairs2(int n) {
        if(n<=2){return n;}
        //n>=3的情况使用dp处理
        int[] dp =  new int[n+1];
        dp[1] = 1;
        dp[2] = 2;
        for(int i=3;i<=n;i++){
            dp[i] = dp[i-1]+dp[i-2];
        }
        return dp[n];
     }

posted @ 2020-07-19 00:41  北鼻coder  阅读(336)  评论(0编辑  收藏  举报