假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
例:
输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶
输入:n = 3 输出:3 解释:有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶
第一种:递归
走楼梯时:
当第一步走1的时候,剩下的n-1个台阶有它的一个走楼梯的个数(剩下的n-1个,有可能第一步走1,有可能第一步走2个,就等于f(n-1) = f(n-2) + f(n-3))。
当第一步走2个台阶的时候,剩下的n-2个台阶有它的一个走楼梯的个数(剩下的n-2个台阶,也有可能第一步走1个台阶,也有可能第一步走第二个台阶,也就是f(n-2) = f(n-3)+f(n-4))。
总结:f(n) = f(n-1)+f(n-2)
第一步走1个台阶的个数加上第一步走2个台阶的个数。
当n = 2时 f(2) = 2;
当n=1时 f(1) = 1;
递归结束。
代码:
private HashMap<Integer,Integer> hashMap = new HashMap();
public int climbStairs(int n) {
if(n == 1) return 1;
if(n == 2) return 2;
if(hashMap.get(n) !=null){
return hashMap.get(n);
}else{
int value = climbStairs(n-1) +climbStairs(n-2);
hashMap.put(n,value);
return value;
}
}
第二种 累加
f(1) = 1;
f(2) =2;
f(3) = f(2)+f(1);
f(4) = f(3)+f(2);
当有了f(1)和 f(2)后,f(3) 也就有了,有了f(3) 自然有了f(4);所以可以循环累加,直到>n
代码:
public int climbStairs(int n) {
if(n==1) return 1;
if(n==2) return 2;
int resule = 0;
int n1 = 1;
int n2 = 2;
for(int i = 3;i<=n;i++){
resule = n1+n2;
n1 = n2;
n2 = resule;
}
return resule;
}