【Golang】LeetCode 70. 爬楼梯

70. 爬楼梯

题目描述

思路

下班之后又想偷懒了,但最近学习了"日行 20 英里"的原则,写几道题并整理一下思路吧。

爬楼梯是最经典的一道一维动态规划问题。由于这道题已经刷过太多次了,基本上每次再遇到都是速敲一遍秒过,发现我好像已经很久没有思考过这道题是如何运用动态规划了。本着熟络熟络算法,写一道题就整理一道题的原则,现在对这部分的思考它来了。

解这道题目我一般会加入一道特判,首先判断n == 0、n == 1和n == 2三种情况。针对n == 0的情况,显然不存在任何爬楼梯的方案,答案就是0;针对n == 1的情况,题目中已经明确说我们每次可以爬一格楼梯或两格楼梯,显然此时只有一级台阶,我们只能爬一格,所以此时答案就是1;针对n == 2的情况,我们可以爬楼梯的方案有两种,要么在第零级一次爬两格,要么分两次,每次爬一格,因此答案就是2。

分析到这里,我们不难看出,实际上这道题目最后要求的,就是我们有无穷多个1和2,从0开始我们每次可以加1或加2,有多少种方案最后可以得到和为n。解决的方法其实很简单,我们可以使用一个名为dp的数组来记录每一个i∈(0,n]i \in (0, n]i∈(0,n]的数的加和方案数。初始时我们已经知道dp[0] = 0、dp[1] = 1以及dp[2] = 2,因此从i == 3开始,我们有状态转移方程dp[i] = dp[i - 1] + dp[i - 2],比如从第3级开始,我们的方案要么是从第1级爬两个台阶,要么是从第2级爬一格台阶。dp统计的是方案数,而不是真实的爬台阶级数,因此这里是对方案数进行汇总。

最后,返回dp[n]就是最后的答案。

Golang 题解

go 复制代码
func climbStairs(n int) int {
    if n == 0 {
        return 0
    } else if n == 1 {
        return 1
    } else if n == 2 {
        return 2
    }
    dp := make([]int, n + 1)
    dp[0], dp[1], dp[2] = 0, 1, 2
    for i := 3; i <= n; i ++ {
        dp[i] = dp[i - 1] + dp[i - 2]
    }
    return dp[n]
}
相关推荐
All for pursuit.1 小时前
【回溯-7】494.目标和
数据结构·c++·算法·leetcode
白杨尚青1 小时前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
Jasmine_llq1 小时前
《P17461 [GESP202609 八级] 生成树计数》
算法·栈·tarjan 算法·边双连通分量·深度优先搜索 dfs·tarjan 保存当前路径节点·模乘法
Jasmine_llq1 小时前
《P17462 [GESP202609 八级] 末班车》
算法·dijkstra 算法·最大化版本,求最长可行值·建反向图(逆图 / 反转边)·多源 dijkstra 思想·对每个终点单独跑一遍djst·离线预处理 + 在线查询
the3clipse2 小时前
H.265熵编码核心:CABAC自适应二进制算术编码详解——如何将语法元素高效压缩为比特流
人工智能·算法·视频编码·h.265·hevc·cabac·cavlc
CQU_JIAKE2 小时前
10.4【A】
算法
Godspeed Zhao2 小时前
现代智能雷达技术19——算法(5)
算法
(Charon)2 小时前
【C++面试】RAII到底是什么:从资源管理理解C++对象生命周期
c++·算法·面试
Omics Pro2 小时前
之江实验室NAR|虚拟细胞3阶段训练范式
数据库·人工智能·算法·机器学习·自然语言处理
Tisfy2 小时前
LeetCode 0678.有效的括号字符串:O(n)+O(1)一次遍历
算法·leetcode·字符串·题解·贪心·括号匹配