假设你正在爬楼梯。需要 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为楼梯阶数,f(n)为爬到楼顶的方法数; 则n=1时,f(n)=1;n=2时,f(n)=2; n=3时,f(n)=3;.......;通过分析可知
f(n)=f(n-1)+f(n-2);此时能够想到用递归的方法解决,代码如下:
public static int fun1(int n) {
if(n==1||n==2) {
return n;
}
return fun1(n-1)+fun1(n-2);
}
提交答案,结果时间超限
没办法,只能优化代码,采用动态规划的思想改进代码。
class Solution {
private int dp[]=new int[100];
public int climbStairs(int n) {
if(n==1||n==2) {
return n;
}
if(dp[n-1]==0) {
dp[n-1]=climbStairs(n-1);
}
if(dp[n-2]==0) {
dp[n-2]=climbStairs(n-2);
}
return dp[n-1]+dp[n-2];
}
}
结果自然是只能通过了。