111. 爬楼梯
假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?
样例
比如n=3,1+1+1=1+2=2+1=3,共有3种不同的方法
返回 3
解题思路:没接触过动态规划的时候,我用排列组合做的,在我这篇博客中(https://blog.csdn.net/yong_zi/article/details/81545767),可以看一下。
实际上,这个题目就是一个斐波那契数列,这次采用记忆化搜索的方式代替之前的递归实现。提交完之后看了一下解题报告,这个题目可以不用开数组,设置两个变量记录第一个和第二个位置即可。
代码:
public class Solution {
/**
* @param n: An integer
* @return: An integer
*/
public int climbStairs(int n) {
// write your code here
if(n<1)
return n;
if(n==1)
return 1;
int[] dp = new int[n];
dp[0] = 1;
dp[1] = 2;
for(int i=2;i<n;i++)
dp[i] = dp[i-1]+dp[i-2];
return dp[n-1];
}
}
不开数组:
public class Solution {
public int climbStairs(int n) {
if (n <= 1) {
return n;
}
int last = 1, lastlast = 1;
int now = 0;
for (int i = 2; i <= n; i++) {
now = last + lastlast;
lastlast = last;
last = now;
}
return now;
}
}