题目
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
class Solution {
public int climbStairs(int n) {
return climbStairs(n,new HashMap<Integer,Integer>());
}
public int climbStairs(int n, Map<Integer,Integer> map) {
if(n==1){
return 1;
}
if(n==2){
return 2;
}
if(map.containsKey(n)){
return map.get(n);
}
int r = climbStairs(n-2,map) + climbStairs(n-1,map);
map.put(n,r);
return r;
}
}
进阶
题目改为:每次可以走1,2,3步,但如果本次走3步,下一次因为体力不支,不能走3步
package org.plumecache.samples.test;
public class T1 {
public static void main(String[] args) {
System.out.println(f(6, 0));
}
/**
* @param n 当前台阶数量
* @param tag 0:本次可以走3步,1:本次不可以走3步
* @return
*/
private static int f(int n, int tag) {
if (n == 1 || n == 0) {
return 1;
}
if (n == 2) {
return 2;
}
//下一次不是3步,那本次可以走1,2,3步
if (tag == 0) {
return f(n - 3, 1) + f(n - 2, 0) + f(n - 1, 0);
}
//下一次是3步,那本次只能走1,2步
return f(n - 1, 0) + f(n - 2, 0);
}
}