✿-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层楼梯)