✿-2例题 递归、动态规划--爬楼梯-70

Posted on 2020-11-02 19:54  MissRong  阅读(61)  评论(0)    收藏  举报

✿-2例题  递归、动态规划--爬楼梯-70

一、题目

 

 二、Java代码

1.动态规划实现

package dongTaiGuiHua;

/**
 * @Author : ASUS and xinrong
 * @Version : 2020/10/29 & 1.0
 * 爬楼梯-70
 * 动态规划实现
 *
 * 复杂度分析:
 * 时间复杂度:循环执行 n 次,每次花费常数的时间代价,故渐进时间复杂度为 O(n)。
 * 空间复杂度:这里只用了常数个变量作为辅助空间,故渐进空间复杂度为 O(1)。
 */
public class PaLouTi_70_DongTaiGuiHua {
    //易于理解的写法:
    public static int climbStairs(int n) {
        if (n <= 2) {
            return n;
        }
        int first = 1;
        int second = 2;
        int tmpFirst;
        for (int i = 3; i <= n; i++) {
            tmpFirst = first;
            first = second;
            second = tmpFirst + first;
        }
        return second;
    }
    //另外一种写法:
    public static int climbStairs2(int n) {
        int p ,q = 0,r = 1;
        for(int i=1;i<=n;i++){
            p = q;
            q = r;
            r = p + q;
        }
        return r;
    }

    public static void main(String[] args) {
        System.out.println(climbStairs(7));
    }
}

2.利用斐波那契公式实现

斐波那契公式:

这个公式就是斐波那契公式,1,1,2,3,5,8,13……,
但我们这道题的前几项是1,2,3,5,8……明显比那公式少了一项,所以这里计算第n项的指数应该是n+1。

复制代码
package dongTaiGuiHua;

/**
 * @Author : ASUS and xinrong
 * @Version : 2020/10/29 & 1.0
 * 爬楼梯-70
 * 根据斐波那契公式求解
 *
 * 复杂度:
 * 时间复杂度:O(logn),pow 方法将会用去 O(logn) 的时间。
 * 空间复杂度:O(1)。
 */
public class PaLouTi_70_FeiBoNaQieGongShi {
    public static int climbStairs(int n) {
        double sqrt5 = Math.sqrt(5);
        double sum=Math.pow((1+sqrt5)/2,n+1)-Math.pow((1-sqrt5)/2,n+1);
        return (int)(sum/sqrt5);
    }
    public static void main(String[] args) {
        System.out.println(climbStairs(6));
    }
}
复制代码

3.递归实现

    /**
     * 递归方法
     * @param n
     * @return
     * 时间复杂度:O(2^n)
     * 空间复杂度:O(n) 其中n为递归的深度
     */
    public int climbStairs3(int n){
        //特况
        if (n <= 2) {
            return n;
        }
        return climbStairs3(n - 1) + climbStairs3(n-2);
    }

三、总结

四、拓展问题

1.如果一次最多可走3层楼梯

    /**
     * 更改要求-1:一次最多可跨3层
     * 1: 1 一种
     * 2:1+1、2 共两种
     * 3:1+1+1 、1+2、2+1、3 共四种
     * 递归公式:f(n)=f(n-3)+f(n-2)+f(n-1)
     * @param n
     * @return
     * 动态规划,时间复杂度:O(n),空间复杂度:O(1)
     */
    public int climbStairsThree(int n) {
        if (n <= 2) {
            return n;
        }
        int p = 1,q = 1, k = 2, s = 0;
        for (int i = 3; i <= n; i++) {
            s = p + q + k;
            p = q;
            q = k;
            k = s;
        }
        return s;
    }

2.打印出所有的走法(一次可走1 / 2层楼梯)

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3