一道经典的动态规划题目爬楼梯
我们知道,按照题目描述,我们可以知道
- n = 1 : 可以有一种走法,走一阶台阶。总共有一种走法
- n = 2: 可以有两种走法,走一阶在走一阶 或者是 一次走两阶。总共有两种走法
- n = 3: 可以有三种走法,走一阶在走一阶在走一阶 或者 第一次走两阶 第二次走一阶 或者第一次走一阶第二次走两阶。总共有三种走法。
由此可见,当n < =3的时候 走法的是等于n的。所以我们用这个思路开写!!!
class Solution {
public int climbStairs(int n) {
return n > 3 ? climbStairs(n - 1) + climbStairs(n - 2) : n;
}
}
vocal!超时了什么情况!!
哦! 我想起来了,假如n为4的时候,climbStairs(n - 1) 和climbStairs(n - 2) 他们之间存在大量重复的计算。在这里 climbStairs(n - 1),n减一在减一之后为2 这里得计算climbStairs(2)的值。
在climbStairs(n - 2)里,n-2 后 也得计算一遍 climbStairs(2),所以当这个n的值很大的时候,这个时间的消耗就会膨胀的很快。
所以我们就可以想办法把这个值提前给记录下来,不用重复去计算。类似备忘录。
class Solution {
public int climbStairs(int n) {
if(n <= 3){
return n;
}
int[] dp = new int[n + 1];
dp[1] = 1;
dp[2] = 2;
for(int i = 3; i <= n; i++){
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
当 n <= 3时,走法就是等于n。然后我们先把走一阶和走两阶的走法存在dp数组里面。
然后我们可以自底向上,逐渐靠近n,在数组里依次记录前i个台阶总共有几种走法。
最后大功告成完成!!!
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1vq20gbk2eut1