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
很简单的一道题,就是因为对递推关系没有彻底理解所以卡壳
题目大意:每次只能上一步或两步,到达当前楼梯层有几种组合。
解题思路:当前楼梯到达的方式有两种,第一种是通过上一层楼梯跨一步到达,第二种是通过上两层楼梯跨两步到达。递推关系显而易见dp[n] = dp[n - 1] + dp[n - 2]
1.维护一个数组
比较显而易见的做法
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];
}
2.只维护3个常量(节省了空间)
public int climbStairs(int n) {
if(n == 1)
return 1;
int small = 1,big = 2;
while(n-- > 2){
int temp = small + big;
small = big;
big = temp;
}
return big;
}
原谅我变量名起的很随意。