题目描述
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Note: Given n will be a positive integer.
Example 1:
Input: 2
Output: 2
Explanation: There are two ways to climb to the top.
1.1 step + 1 step
2. 2 steps
Example 2:
Input: 3
Output: 3
Explanation: There are three ways to climb to the top.
1.1 step + 1 step + 1 step
2 1 step + 2 steps
3 2 steps + 1 step
规定一次可以上一级/两级台阶,求走上n阶台阶可能有多少种走法
解题思路
动态规划的经典例题,实质是斐波那契数列
动态规划适用于:问题前后直接相关,前面的结果直接影响到后面的结果,
想求当前值,必须由前面的值推导得到。
这题也是这种思路,想知道到第i阶有多少种走法:就第i阶来说,可以从第i-1阶再走一步到达,或者从第i-2阶再走两步到达,
设置dp[i]表示到第i阶所有的走法,所以:dp[i]=dp[i-1]+dp[i-2] ------->不断地向后递推
实现代码
根据上述思路可得Java代码:.
public class ClimbingStairs70 {
//动态规划是根据后面的结果推测出前面的结果
//dp[i]表示i个台阶总共有多少种走法,最后所需返回的答案就是 dp[n]
public int ClimbStairs(int n) {
if(n<3) return n;
int dp[] = new int[n+1]; //dp[n]表示到第n阶的走法数,二数组下标是从0开始的,若想下标最大=n,数组空间必须是n+1
dp[0]=1;
dp[1]=1;
for(int i=2;i<n+1;i++) {
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
补充
这种题递归当然是可以的,而且逻辑很简单,但是时间复杂度实在吃不消,LeetCode系统测试超时,无法通过,
public class ClimbingStairs70 {
public int climbStairs(int n) {
if(n<3) return n;
return climbStairs(n-1)+climbStairs(n-2);
}