题目: 爬楼梯
题号:70
难易程度:简单
题面:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1 阶 + 1 阶
2 阶
示例2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1 阶 + 1 阶 + 1 阶
1 阶 + 2 阶
2 阶 + 1 阶
题目意思:
题解:
题解:先通过找规律发现1阶楼梯一种方法,2阶楼梯有两种方法,三阶楼梯时有2+1三种方法。所以依次类推,n阶楼梯有(n-1)+(n-2)的数量和。但是这样直接递归会出现很多重复的计算,
所以采用记忆化递归的方法,将每次的数量进行记录,
public class LeetCode70 {
/**
* 直接递归
* @param n
* @return
*/
public int climbStairs1(int n) {
if (n == 1) {
return 1;
}
if (n == 2) {
return 2;
}
return climbStairs1(n - 1) + climbStairs1(n - 2);
}
/**
* 记忆化递归
* @param n
* @return
*/
public int climbStairs(int n){
int [] memo = new int[n+1];
return climbStairMemo(n,memo);
}
public int climbStairMemo(int n,int [] memo){
if (memo[n]>0){
return memo[n];
}
if (n ==1){
memo[n] =1;
}else if (n==2){
memo[n] = 2;
}else {
memo[n] = climbStairMemo(n-1,memo)+climbStairMemo(n-2,memo);
}
return memo[n];
}
}