1.问题描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
2.所示例子
示例 1:比如你要爬2个台阶
解释:有两种方法可以爬到楼顶。
每次只爬1个台阶:1+1 每次只爬2个台阶:2
示例 2:比如你要爬3个台阶
解释:有三种方法可以爬到楼顶。
每次只爬1个台阶:1+1+1 1个台阶和2个台阶交互爬:1+2或者2+1
方法一:迭代
//第n个台阶只能从第n-1或者n-2个上来。 //到第n-1个台阶的走法 + 第n-2个台阶的走法 = 到第n个台阶的走法 //已经知道了第1个和第2个台阶的走法,一路加上去。第1个台阶只有一种上去的方法,第2个台阶有两种 //相当于是从下面一点点往上捋顺 //写上程序发现,这不就是斐波那契数列嘛
Main类
public class Main {
public static void main(String[] args) {
Solution solution = new Solution();
int num = solution.climbStairs(5);
System.out.println(num);
}
}
Solution类
public class Solution {
public int climbStairs(int n) {
if(n==1||n==2) return n;//台阶数是1或者2的时候,可能性恰恰就是1或2,所以直接返回n即可
int a = 1,b = 2;//a表示第n-2个台阶的走法,b表示第n-1个台阶的走法,传统迭代
int count = 0 ;
for(int i = 3;i<=n;i++){
count = a+b;
//向下迭代
a = b;//下次迭代的第n-2个台阶的走法等于上次迭代n-1个台阶的走法
b = count;//下次迭代的第n-1个台阶的走法等于上次迭代的第n个台阶走法
}
return count;
}
}
方法二:用dp数组的形式
虽然会多了一个数组的空间,但是是对于动态规划的练习 思路:一般看到题目有多少种方案,这种题意思不需要你列出来具体的多少种方案只需要计算有多少种方案,基本上就可以尝试用动态规划算法来解决问题。 想好用动态规划就想想动态规划五步曲。 确定dp数组以及下标的含义 定义dp[i]为爬上第 i 级台阶有多少种方案; 确定状态转移方程 每次只可以爬1或2个台阶所以,爬上当前台阶的方案应该是前面两个状态的方案的和即,dp[i] = dp[i-1] + dp[i-2]。 初始化状态i=0级开始爬的,我们可以看作只有一种方案,即 dp[0]=1;i=1代表从第0级到第1级也只有一种方案,即爬一级,dp(1)=1。 其实题目强调了是1 <= n <= 45,所以其实不用从i=0开始,直接从i=1和i=2开始即可 遍历顺序 由状态转移方程知道dp[i] 是从 dp[i−1] 和 dp[i−2] 转移过来所以从前往后遍历。 返回值 因为一共计算 n 阶楼梯有多少方案,所以返回dp[n]。
class Solution {
public int climbStairs(int n) {
int [] dp=new int [n+1];
dp[0]=1;
dp[1]=1;
for(int i=2;i<=n;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
}
方法三:递归
class Solution {
public int climbStairs(int n) {
if(n==1||n==0) return 1;
else return climbStairs(n-1)+climbStairs(n-2);
}
}