动态规划-爬楼梯-斐波那契数
·
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
提示:
1 <= n <= 45
解题思路:因为1<=n<=45,也可以用打表的方式解题,
public int climbStairs(int n) {
int result = 0;
switch(n){
case 1: result = 1; break;
case 2: result = 2; break;
case 3: result = 3; break;
case 4: result = 5; break;
case 5: result = 8; break;
case 6: result = 13; break;
case 7: result = 21; break;
case 8: result = 34; break;
case 9: result = 55; break;
case 10: result = 89; break;
case 11: result = 144; break;
case 12: result = 233; break;
case 13: result = 377; break;
case 14: result = 610; break;
case 15: result = 987; break;
case 16: result = 1597; break;
case 17: result = 2584; break;
case 18: result = 4181; break;
case 19: result = 6765; break;
case 20: result = 10946; break;
case 21: result = 17711; break;
case 22: result = 28657; break;
case 23: result = 46368; break;
case 24: result = 75025; break;
case 25: result = 121393; break;
case 26: result = 196418; break;
case 27: result = 317811; break;
case 28: result = 514229; break;
case 29: result = 832040; break;
case 30: result = 1346269; break;
case 31: result = 2178309; break;
case 32: result = 3524578; break;
case 33: result = 5702887; break;
case 34: result = 9227465; break;
case 35: result = 14930352; break;
case 36: result = 24157817; break;
case 37: result = 39088169; break;
case 38: result = 63245986; break;
case 39: result = 102334155; break;
case 40: result = 165580141; break;
case 41: result = 267914296; break;
case 42: result = 433494437; break;
case 43: result = 701408733; break;
case 44: result = 1134903170; break;
case 45: result = 1836311903; break;
}
return result;
}
或者:
public int climbStairs(int n) {
return new int[]{
0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903
}[n];
}
不过还是推荐根据:f(x)=f(x−1)+f(x−2)
也就是说爬到第 x级台阶的方案数是爬到第 x−1 级台阶的方案数和爬到第x−2 级台阶的方案数的和,因为从第0级到1级只有一种方案,从0级到2级有2种方案,从1级到2级有一种方案,也就是当前的层级等于前面两个层级的累加。
可以说,当遇到那种每次进行1或2的试探时可以考虑一下是否符合爬楼梯的思路。
即:
class Solution {
public int climbStairs(int n) {
int p = 0, q = 0, r = 1;
for (int i = 1; i <= n; ++i) {
p = q;
q = r;
r = p + q;
}
return r;
}
}
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
示例 1:
输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1
示例 2:
输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2
示例 3:
输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3
提示:
0 <= n <= 30
解题思路:看着这0 <= n <= 30的范围我陷入了沉思......
打表:
class Solution {
public int fib(int N) {
if(N==0)
return 0;
if(N==1)
return 1;
if(N==2)
return 1;
if(N==3)
return 2;
if(N==4)
return 3;
if(N==5)
return 5;
if(N==6)
return 8;
if(N==7)
return 13;
if(N==8)
return 21;
if(N==9)
return 34;
if(N==10)
return 55;
if(N==11)
return 89;
if(N==12)
return 144;
if(N==13)
return 233;
if(N==14)
return 377;
if(N==15)
return 610;
if(N==16)
return 987;
if(N==17)
return 1597;
if(N==18)
return 2584;
if(N==19)
return 4181;
if(N==20)
return 6765;
if(N==21)
return 10946;
if(N==22)
return 17711;
if(N==23)
return 28657;
if(N==24)
return 46368;
if(N==25)
return 75025;
if(N==26)
return 121393;
if(N==27)
return 196418;
if(N==28)
return 317811;
if(N==29)
return 514229;
if(N==30)
return 832040;
return 0;
}
}
上一题一样的写法:
class Solution {
public int fib(int n) {
if(n==0)return 0;
if(n==1)return 1;
int a0=0,a1=1,r=0;
for(int i=2;i<=n;i++){
r=a0+a1;
a0=a1;
a1=r;
}
return r;
}
}
总结:万物皆可斐波那契......

近日总结:马上要5月份了,焦虑......
更多推荐


所有评论(0)