暴力解法
int climbStairs(int n){
int solution = 0;
// 递归函数,返回值表示个数
int climb(int i,int n){
if(i > n){
return 0;
}
if( i == n){
return 1;
}
//转移方程
return climb(i+1,n) + climb(i+2,n);
}
solution = climb(0,n);
return solution;
}
记忆化递归
- 例如上面的递归树,有很多节点是算了好几遍的(4,5)等等,我们可以用将他们记录下来,避免再次递归计算。
- 个人有一个无奈的地方是记忆数组的初始化…但是不写报错,默认值根本不是0。
int climbStairs(int n){
int solution = 0;
int j;
// 二叉树有n+1个非叶子节点
int memory[n+1];
for( j = 0; j < n+1; j++){
memory[j] = 0;
}
// 递归函数,返回值表示个数
int climb(int i,int n,int* memory){
// 叶子节点
if(i > n){
return 0;
}
if( i == n){
return 1;
}
// 记忆节点
if(memory[i] > 0){
return memory[i];
}
// 非叶子节点
memory[i] = climb(i+1,n,memory) + climb(i+2,n,memory);
//转移方程
return memory[i];
}
solution = climb(0,n,memory);
return solution;
}
动态规划
int climbStairs(int n){
if( n ==1 ){
return 1;
}
int dp[n+1];
int i ;
dp[1] = 1;
dp[2] = 2;
for( i =3; i <= n; i++ ){
dp[i] = dp[i-1] + dp[i - 2];
}
return dp[n];
}
参考
[ 1 ]官方解读