zoukankan      html  css  js  c++  java
  • climbing-stairs-动态规划,爬楼梯的路径数

    You are climbing a stair case. It takes n steps to reach to the top.

    Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

    现在说一下大致思路:求出递推公式

    f(n)=f(n-1)+f(n-2) ===>f(n)+f(n-1)=2f(n-1)+f(n-2)

    [f(n) f(n-1)]=[[1 1][1 0]][f(n-1) f(n-2)]

    可以得到递推矩阵

    所以该算法的关键点就是:1.需要求出递推矩阵;2.写一个方法,能够实现矩阵相乘

    虽然代码量会比其他几个方法大,但是算法复杂度比较低

    * 动态规划解法
     */
    public int climbStairs3(int n) {
        if (n <= 0)
            return 0;
        if (n == 1)
            return 1;
        if (n == 2)
            return 2;
     
        int[][] base = { { 1, 1 }, { 1, 0 } };
        int[][] res = matrixPower(base, n - 2);
     
        return 2*res[0][0] + res[1][0];
    }
    /*
     * 两个矩阵相乘
     */
    private int[][] muliMatrix(int[][] m1, int[][] m2) {
        int[][] res = new int[m1.length][m2[0].length];
        for (int i = 0; i < m1.length; i++) {
            for (int j = 0; j < m2[0].length; j++) {
                for (int k = 0; k < m2.length; k++) {
                    res[i][j] += m1[i][k] * m2[k][j];
                }
            }
        }
        return res;
    }

    包含三种最常用的回答,第一最优,第三最差 

    * 空间复杂度O(1);
     */
    public int climbStairs(int n) {
        if (n < 3)
            return n;
        int one_step_before = 2;
        int two_steps_before = 1;
        int all_ways = 0;
        for (int i = 2; i < n; i++) {
            all_ways = one_step_before + two_steps_before;
            two_steps_before = one_step_before;
            one_step_before = all_ways;
        }
        return all_ways;
    }
    /*
     * 空间复杂度O(n);
     */
    public int climbStairs_2(int n) {
        if (n < 3)
            return n;
        int[] res = new int[n + 1];
        res[1] = 1;
        res[2] = 2;
        for (int i = 3; i <= n; i++) {
            res[i] = res[i - 1] + res[i - 2];
        }
        return res[n];
    }
    /*
     * 方法一:递归 时间复杂度高
     */
    public int climbStairs_1(int n) {
        if (n < 1)
            return 0;
        if (n == 1)
            return 1;
        if (n == 2)
            return 2;
        return climbStairs_1(n - 1) + climbStairs_1(n - 2);
    }

     斐波那契数列

    class Solution {
    public:
        int climbStairs(int n) {
            int f = 1;
            int g = 0;
            while(n--){
                f += g;
                g = f -g;          
            }
            return f;
        }
    };
  • 相关阅读:
    Jackson学习资料
    servlet/filter/listener/interceptor区别与联系
    JDBC、JTA、Spring的事务管理
    hibernate 的SessionFactory的getCurrentSession 与 openSession() 的区别
    Spring MVC如何配置OpenSessionInViewInterceptor并结合Hibernate使用
    SpringMVC中使用Interceptor拦截器
    Hibernate条件查询
    Spring MVC之@RequestBody, @ResponseBody 详解
    Sping Environment为Null的原因和解决方法
    SpringMVC+Thymeleaf如何处理URL中的动态查询参数
  • 原文地址:https://www.cnblogs.com/zl1991/p/9630685.html
Copyright © 2011-2022 走看看