假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
假如有n个阶梯,可以分成两部分来走,先走一个阶梯,再走剩下的n-1个阶梯,或者先走两个阶梯,再走剩下的n-2个阶梯,有两种组合方式。对于剩下的n-1或者n-2个阶梯怎么走呢?也是相同的处理方法,先走一个阶梯或者先走两个阶梯,还是两种组合。一直递归下去即可。
显然,阶数为n时,我们的组合有f(n-1) + f(n-2)种,其中f(n)表示n个阶梯对应的走法。
状态转移方程:f(n) = f(n-1) + f(n-2)
class Solution:
def climbStairs(self, n):
if n == 1:
return 1
if n == 2:
return 2
else:
return self.climbStairs(n-1) + self.climbStairs(n-2)
但是这个做法的时间超过了
另一种递推的方法:
class Solution:
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
num = [0, 1, 2] # 这里的元素设置是为了方便下标一一对应
if n == 1:
return num[1]
if n == 2:
return num[2]
else:
for i in range(3, n+1): # 这里range是到n为止
num.append(num[i-1]+num[i-2])
return num[n]
以下是Java版本:
题解:
这道题就是经典的讲解最简单的DP问题的问题。。
假设梯子有n层,那么如何爬到第n层呢,因为每次只能怕1或2步,那么爬到第n层的方法要么是从第n-1层一步上来的,要不就是从n-2层2步上来的,所以递推公式非常容易的就得出了:
dp[n] = dp[n-1] + dp[n-2]
如果梯子有1层或者2层,dp[1] = 1, dp[2] = 2,如果梯子有0层,自然dp[0] = 0
public class ClimbingStairs {
public int climbStairs(int n) {
if(n==0||n==1||n==2)
return n;
int [] dp = new int[n+1];
dp[0]=0;
dp[1]=1;
dp[2]=2;
for(int i = 3; i<n+1; i++){
dp[i] = dp[i-1]+dp[i-2];
}
return dp[n];
}
}