从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级楼梯有多少种跳法(必须刚好跳上),最少跳多少次—— 完全背包问题