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
My approach
class Solution {
public int climbStairs(int n) {
// use dynamic programming to avoid computing same value repeatedly
if(n==0||n==1) return 1;
int[] nums = new int[n+1];
nums[0] = 1;
nums[1] = 1;
for(int i=2;i<n+1;i++){
nums[i] = nums[i-1]+nums[i-2];
}
return nums[n];
}
}
分析:
这道题还是考察递归的思想,观察到climbStairs(n) = climbStaris(n-1)+climbStairs(n-2)之后,可以写出简单的递归答案如下:
class Solution {
public int climbStairs(int n) {
if(n<0) return 0;
if(n==0) return 1;
if(n==1) return 1;
if(n==2) return 2;
return climbStairs(n-1) + climbStairs(n-2);
}
}
但是如果这样做的话,会重复计算很多元素,造成时间的浪费。
所以考虑dynamic programming 的方法,将每次算的结果保存在一个数组里,如前面的解答所示。
问题升级版:
不光给n, 还给一个可以走的步数的集合X, 比如X={1,3,5},意味着在每个楼梯可以走1步3步或者5步。
未完待续。