力扣hot 100 70.爬楼梯
力扣hot 100 70.爬楼梯
题目描述
假设你正在爬楼梯,需要n阶你才能到达楼顶。每次你可以爬1或者2个台阶。你有多少种不同的方法可以爬到楼顶呢?(给定n是一个正整数)
题目分析
当n=1的时候,只有一种爬法:当n=2的时候,有两种爬法;当n=3的时候,这时候有3种爬法,分别是1+1+1、1+2、2+1;当n=4的时候,有5种爬法,分别是1+1+1+1、1+2+1,2+1+1,1+1+2,2+2......以此类推,可以明显的发现,当n>2的时候,n个台阶的爬法等于n-1和n-2个台阶的爬法的和,有点类似与斐波那契数列,其中的n1和n2变为了1和2。只要发现了爬楼梯的这一个规律,就可以很简单的写出求解的代码了。
public int climbStairs(int n) {
if(n <= 2){
return n;
}
int i1 = 1;
int i2 = 2;
for(int i = 3 ; i <= n ; i++){
int temp = i1 + i2;
i1 = i2;
i2 = temp;
}
return i2;
}
后话
做题的时候,自己的第一想法并没有想到类似斐波那契数列。只是单纯的想到固有一种1+1+1....的爬法,可以将两个1代替为2,第一个2有n-2个摆放位置,类推累加,有一点点的排列组合的感觉,写出来的代码不出意外的超出时间限制了~~ 后面想了想才发现其中规律。
看评论区大佬都说这是一道典型的动态规划题。唔,还是有点迷迷糊糊的.....