「动态规划」LeetCode 70(爬楼梯)
Posted 烤冷面的技术博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「动态规划」LeetCode 70(爬楼梯)相关的知识,希望对你有一定的参考价值。
Leetcode 70 题
有人问我:烤冷面你这两周怎么总搞简单题?我想说:一步一步来~
题干简述
给定:
- 假设你正在爬楼梯,需要爬 n 阶你才能到达楼顶。
- 每次你可以爬 1 或 2 个台阶。
要求:计算出有多少种爬楼梯的方式。
解题思路
如果我们缩小视野(把大问题化为小问题),爬到第 n 阶台阶有两种方式:
- 从 n-1 阶爬一级台阶
- 从 n-2 阶爬两级台阶
用公式表达:dp[n] = dp[n−1] + dp[n−2]
,其中的特例是:dp[0]=1 和 dp[1]=1
。
嚯!这不就是LeetCode 509(斐波那契数列)么。
代码实现
class Solution:
def climbStairs(self, n: int) -> int:
if n <= 2:
return n
dp = [0]*(n+1)
dp[0] = 1
dp[1] = 1
for i in range(2, n+1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]
复杂度
时间复杂度O(n),空间复杂度O(n)。
关注公众号:「腐蚀脚本」,加入交流群。
文章归档:烤冷面讲算法系列
转载声明:本文章允许转载,原文地址:「动态规划」LeetCode 70(爬楼梯)
#动态规划 LeetCode 70 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1 阶 + 1 阶
2 阶
示例 2:
输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1 阶 + 1 阶 + 1 阶 1 阶 + 2 阶 2 阶 + 1 阶
思路:
关于动态规划的问题,一般选择先使用递归的思路切入问题。以本题为例:
- 递归的思路,我们要确定当前递归函数的定义。假设,当前我们把当前函数F(n),定义为走完n阶楼梯全部走法。下一步,我们来把它分解为子问题F(n-1)与F(n-2),分别代表走到倒数第一阶梯和倒数第二阶梯的全部走法数量。
- 在F(n-1)状态下,我们只需要走一步即可走到n,F(n-2)同理。所以问题可以提出状态转移方程:F(n) = F(n-1)+F(n-2)
- 依照上述思路,我们可以把F(n)分解为一个树形结构。即
-
- 状态转移方程可以写作:F(n) = F(n-1)+F(n-2)= F(n-2)+F(n-3) + F(n-3)+F(n-4)。
- 我们将对应的树形结构反过来从叶子结点开始观察。F(2) = F(1)+ F(0) 发现状态转移方程从下至上也是成立的。
- 所以我们按照状态转移方程从F(0)、F(1)带入转移方程,即可依次计算出F(n)。
- F(2) = F(1)+ F(0) FF(3) = F(2)+ F(1)。。。。。。。。。。。。。F(n-1) = F(n-2)+ F(n-3) F(n) = F(n-1)+F(n-2)
- 使用for循环即可计算出所求的F(n)
直接使用动态规划去思考确实有一定难度,如果我们使用递归的思路自上而下思考找到状态转移方程作为切入点,才是解题的方法
class Solution { public int climbStairs(int n) { int[] res = new int[n+1]; for(int i =0 ; i<res.length ; i++) res[i] = -1; res[0] = 1; res[1] = 1; for(int i = 2 ; i<= n; i++) res[i] = res[i-1] + res[i-2]; return res[n]; } }
以上是关于「动态规划」LeetCode 70(爬楼梯)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 70 Climbing Stairs(爬楼梯)(动态规划)(*)
Leetcode刷题100天—70. 爬楼梯(动态规划)—day76