个人算法学习记录Day1
题目:爬楼梯
思路:
1.我们列出结果:当n=1、n=2、n=3、 n=4时
我们观察下面一排整理后的,我们结合题目可以得知,结尾的数字要么为1要么为2,所以我们分成两种情况讨论。
情况1:结尾为1时
我们每次登上1个台阶(n=4时),是n=3的情况下多走了1步(指结尾是1的情况,上图中的下划线部分)。是包括了n=3的所有情况的结尾多走1格,很好理解,毕竟从台阶3上到台阶4只需要跨1格。
情况2:结尾为2时
我们每次登上2个台阶(n=4时),是n=2的情况下多走了2步(指结尾是2的情况,上图中的非下划线部分)。是包括了n=2的所有情况的结尾多走2格,很好理解,毕竟从台阶2上到台阶4只需要跨2格。
2.我们可以从上述思路中发现
dp[4] = dp[3] + dp[2] //dp[n]代表有多少种可能性,即结果
即
dp[n] = dp[n-1] + dp[n-2]
我们已经从结果来倒推公式似乎没有问题,那我们如何在代码层面实现呢?
代码
从**dp[n] = dp[n-1] + dp[n-2]**出发,最简单的方式就是枚举,把每个dp[n]的数字算出来,即使用循环。当然,在dp[1]和dp[2]的结果是直接写出的。
//数组从1开始,不从0
dp[1] = 1;
dp[2] = 2;
for(int i=3;i<=n;i++){
dp[i] = dp[i-1] + dp[i-2];
}
所以我的题解代码如下
int climbStairs(int n) {
int dp[46];
dp[1] = 1;
dp[2] = 2;
int result = 0;
switch(n){
case 1: return 1;
case 2: return 2;
default: break;
}
for(int i=3;i<=n;i++){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
最后
思路草稿: