经典算法题之(八)------ 上n级楼梯

从Fibonacci说起

不多说

Fibonacci(0) = 1
Fibonacci(1) = 1
Fibonacci(n) = Fibonacci(n-1) + Fibonacci(n-2)
  • 递归解法
public int Fibonacci(n){
	if(n < 2)
		return 1;
	return Fibonacci(n-1)+Fibonacci(n-2);
}

当然关于尾递归解法可以参考我的另外一篇文章:尾递归

  • dp解法:
public static int f(int n){
	 if(n < 2)
        return 1;
	int[] dp = new int[n+1];
	dp[0] = 1;
	dp[1] = 1; 
	int i = 2;
	while(i <= n){
		dp[i] = dp[i-1] + dp[i-2];
		i++;
	}
    return dp[n];
}
  • 迭代解法:
public static int f(int n){
    if(n < 2)
        return 1;
    int f1 = 1;
    int f2 = 1;
    int count = 2;
    while(count <= n){
        int temp = f1+f2;     // 完成之前的尾递归的参数变换
        f1 = f2;
        f2 = temp;
        count++;
    }
    return f2;
}

显然,迭代解法使用了常数的空间,O(n)的时间,是最优的解法(PS:N阶空间复杂度的dp解法一般都能改写为N-1阶空间复杂度的迭代写法解决)。

爬楼梯1.0

爬楼梯一次能爬1阶,也能爬2阶。问:一个n阶楼梯有多少种爬法?(n > 0,不考虑后退的情况)
显然:

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

这里说一下理论依据:爬上第n阶楼梯只有两种“来源”:从第n-1级爬1步上来,或者从第n-2级爬2步上来。
这也是使用dp的根本:当前问题总是能往下递归为规模更小的子问题。

显然,最优解法和Fibonacci一样,迭代解法是最优的。

爬楼梯2.0

爬n阶楼梯,一次能爬1阶,也能爬2阶…也能爬n阶,问:一个n阶楼梯有多少种爬法?(n > 0,不考虑后退的情况)
显然:爬到第n阶有n种方式:

  • 从第n-1阶爬1阶上来
  • 从第n-2阶爬2阶上来
  • 从0阶爬n阶上来
    所以:
f(1) = 1;
f(2) = 2;
 // 最后一个1代表“从0阶爬n阶上来”这一种爬法
f(n) = f(n-1) + f(n-2) + ... + f(1) + 1   

当然,还有个很巧妙的解法,在牛客网的评论区看到:
在这里插入图片描述

爬楼梯3.0

爬n阶楼梯,每级楼梯都有特定的可以爬的最远的级数,用数组表示。如一个3级楼梯:arr = {1,3,2},代表站在第0级台阶上,最远可以往上爬1级台阶,即只能爬上第1级台阶;站在第1级台阶上,最多可以往上爬3级台阶,即可以爬上第2级台阶,也可以爬上第3级台阶,还可以爬上第4级台阶(如果有的话);站在第2级台阶上,最多可以往上爬1级台阶,即只能爬上第3级台阶。那么总共有:

  • 0—>1—>2—>3
  • 0—>1—>3
    两种爬法。
    问:现有一个n阶楼梯,和代表每级最多能往上爬多少级的数组:arr,一共有多少种爬法?(arr.length > 0,且为正整数数组)

leetcode题目:

爬楼梯4.0

爬n阶楼梯,每级楼梯都有特定的可以爬的最远的级数,用数组表示。如一个3级楼梯:arr = {1,3,2},代表站在第0级台阶上,最远可以往上爬1级台阶,即只能爬上第1级台阶;站在第1级台阶上,最多可以往上爬3级台阶,即可以爬上第2级台阶,也可以爬上第3级台阶,还可以爬上第4级台阶(如果有的话);站在第2级台阶上,最多可以往上爬1级台阶,即只能爬上第3级台阶。那么总共有:

  • 0—>1—>2—>3
  • 0—>1—>3
    两种爬法,其中最快爬法要跳跃2次。
    问:现有一个n阶楼梯,和代表每级最多能往上爬多少级的数组:arr,请问最快爬法要跳跃多少次?(arr.length > 0,且为正整数数组)

爬楼梯5.0

能否爬到第n阶楼梯?

爬n阶楼梯,每级楼梯都有特定的可以爬的最远的级数,用数组表示。如一个3级楼梯:arr = {1,3,2},代表站在第0级台阶上,最远可以往上爬1级台阶,即只能爬上第1级台阶;站在第1级台阶上,最多可以往上爬3级台阶,即可以爬上第2级台阶,也可以爬上第3级台阶,还可以爬上第4级台阶(如果有的话);站在第2级台阶上,最多可以往上爬1级台阶,即只能爬上第3级台阶。那么总共有:

  • 0—>1—>2—>3
  • 0—>1—>3
    两种爬法,其中最快爬法要跳跃2次。
    问:现有一个n阶楼梯,和代表每级最多能往上爬多少级的数组:arr,请问最快爬法要跳跃多少次?(arr.length > 0,且为正整数数组)

爬楼梯6.0

能够爬到第n阶楼梯,如果能,有多少种爬法,最少要跳跃多少次?

爬楼梯7.0

能够爬到第n阶楼梯,跳法固定,如一次只能跳2步和4步,n级楼梯有多少种跳法(必须刚好跳上)—— 完全背包问题

爬楼梯8.0

能够爬到第n阶楼梯,跳法固定,如一次只能跳2步和4步,n级楼梯有多少种跳法(必须刚好跳上),最少跳多少次—— 完全背包问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值