解题思路
递归需要看是否符合由大问题分解成重复的小问题,然后逐个求解小问题,最后合并答案形成大问题的解。其次,可以考虑是否可以分解成树形结构求解。再次,可以考虑是否可以自上而下地求解,自上而下不仅是从上到下地考虑,也可以倒过来看是否行得通。
package org.tobehonor.algorithm.oj.recursivethinking;
/**
* 爬楼梯
*/
public class ClimbStairs {
public int climbStairs(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
if (n == 2) {
return 2;
}
// 不使用缓存,会超时
int[] caches = new int[n + 1];
caches[1] = 1;
caches[2] = 2;
return countClimbStairs(caches, n);
}
private int countClimbStairs(int[] caches, int n) {
if (caches[n] == 0) {
// 倒过来考虑,一开始走1步和一开始走2步的所有步数
caches[n] = countClimbStairs(caches, n - 1) + countClimbStairs(caches, n - 2);
return caches[n];
}
return caches[n];
}
}