climbing-stairs-动态规划,爬楼梯的路径数
Posted zl1991
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; } };
以上是关于climbing-stairs-动态规划,爬楼梯的路径数的主要内容,如果未能解决你的问题,请参考以下文章