70-爬楼梯以及进化版

70-爬楼梯以及进化版

力扣70

https://leetcode-cn.com/problems/climbing-stairs/

动态规划经典题,没有之一

还是那三句话

  1. 定义动态规划数组的含义
  2. 找出关系式
  3. 找初始值

因为此题实在简单,直接给出java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
public int climbStairs(int n) {
if (n <= 1) return 1;
int[] dp = new int[n + 1]; //1.dp[i]表示到第i阶的方法数
//3.初始值,不可能出现dp[-1],dp[0],dp[1]要注意,dp[1],dp[2]
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
//2.”先到达再说“,现在在第5阶楼梯,可以从3阶跳上来,可以从第4阶跳上来。
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 2] + dp[i - 1];
}
return dp[n];
}

本来此题如此简单,不值得记录,但是!!重点来了,字节跳动2020秋招9月笔试题

多了一个条件:不能连续跳两步

好家伙,早就听说字节喜欢考原题,妙啊真是妙蛙种子吃着妙脆角进了米奇妙妙屋—妙到家了

发现自己真的是知其然不知其所以然,看知乎的数学推导:

https://www.zhihu.com/question/275079633

代码就不贴了,没什么了,把上面的dp递推关系式改一下dp[i] = dp[i - 3] + dp[i - 1];,初始条件手算一下,就可以了,关键是思维和数学推导


其他动态规划的题目可以点击这里

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×