题意理解:
假设你正在爬楼梯。需要
n
阶你才能到达楼顶。其中每次只能爬1阶或2阶。问:爬到楼顶有几种走法?
如: n=1 爬一阶: 1
n=2 爬两阶: 1+1 要么从第1阶再爬一阶,要么从第0阶,一次性爬两阶
n=3 爬三界: 1+2 (1+1)+1 2+1
要么从第2阶再爬一阶即可,要么在第1阶一次性爬两阶即可
而爬到第1阶有一种方式,爬到第2阶有两种方式
故爬到第三阶有1+2=3种方式
则有递推公式:f[i]=f[i-1]+f[i-2]
解题思路:
采用动态规划的方式求解此题,按照五个步骤来分析。
确定dp[]数组和下标的含义,其中dp[i]表示爬到第i阶有几种方式。
确定递归函数:dp[i]=dp[i-1]+dp[i-2]
初始化:dp[1]=1 dp[2]=2
确定遍历方式:总是前面的结果影响后续取值,所以遍历顺序总是从前到后
5.打印dp数组,用于debug
1.动态规划解题
java
public int climbStairs(int n) {
//定义存储
int[] dp=new int[n+1];
//初始化
dp[1]=1;
if(n>1) dp[2]=2;
//遍历
for(int i=3;i<=n;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
2.存储压缩
使用数值取代数组存储结果。空间复杂度O(n+1)------>O(3)
java
public int climbStairs(int n) {
//定义存储
int sum=0,dp1=1,dp2=2;
if(n==1) return dp1;
if(n==2) return dp2;
//初始化
sum=dp1+dp2;
//遍历
for(int i=3;i<=n;i++){
sum=dp1+dp2;
dp1=dp2;
dp2=sum;
}
return sum;
}
3.分析
时间复杂度:O(n) 用于遍历n个状态值
空间复杂度:
数组存储 O(n)
数值存储 O(1)
n表示输入的数值的大小。