概述
【算法面试入门必刷】动态规划-线性dp(一)
- 前言
- 算法入门刷题训练
- 题目AB34:跳台阶
- 题目分析
- 理论准备
- 题解
- 小结
????个人主页:一二三o-0-O的博客
????技术方向:C/C++客户端资深工程师(直播+音视频剪辑)
????????作者简介:数据结构算法与音视频领域创作者
???? 系列专栏:牛客网面试必刷
????专栏目标:帮助伙伴们通过系统训练,掌握数据结构与算法,收获心仪Offer
????推荐一个找工作神器:牛客刷题网 【面试经验|实习招聘内推,求职就业一战解决】
????如果对您有帮助的话,欢迎点赞????收藏????,关注不迷路
【算法入门必刷】数据结构-栈篇系列文章:
【算法入门必刷】数据结构-栈(一)
【算法入门必刷】数据结构-栈(二)
【算法入门必刷】数据结构-栈(三)
【算法入门必刷】数据结构-栈(四)
【算法入门必刷】数据结构-栈(五)
【算法入门必刷】数据结构-栈(六)
【算法入门必刷】动态规划-线性dp篇系列文章:
【算法面试入门必刷】动态规划-线性dp(一)
【算法面试入门必刷】动态规划-线性dp(二)
【算法面试入门必刷】动态规划-线性dp(三)
前言
开启刷题,请点击右边链接进行跳转点击这里
算法入门刷题训练
题目AB34:跳台阶
题目分析
描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
数据范围:1≤n≤40
要求:时间复杂度:O(n)O(n) ,空间复杂度: O(1)O(1)
这道跳台阶的题目属于动态规划的入门题目,起初可以通过类似的入门题目的训练达到熟练掌握DP解题步骤的目的。分析题目可知,青蛙跳上一个n级台阶一共有两种方式:一个是从n-1阶台阶跳上来,一个是从n-2阶台阶上跳上来。因此我们只要求出跳上n-1阶台阶的方式以及跳上n-2阶台阶的方式,就得出了最后的答案,因此类推公式即:f(n) = f(n-1) + f(n-2)
理论准备
任何算法都有相对应的算法模板或者有规律的解题步骤。对于动态规划来讲,做DP相关的算法题要熟练掌握下面DP解题步骤,这样有助于在面对到各种各样的题目时能够提高解题效率:
DP解题步骤:
- 首先要确定dp数组:是一维,二维还是三维;以及下标的含义是什么?
- 根据确定好的dp数组,给出递推公式,也叫状态转移方程。
- 确定dp数组是否需要初始化,初始化为多少。
- 确定遍历的顺序;这一步在背包相关的DP题目中非常重要。
- 根据测试用例进行验证
题解
具体的解决方案如下:
- 首先确定dp数组:是一维,二维还是三维;以及下标的含义是什么?
// 这里使用一维dp即可
// dp[i] 表示青蛙跳上一个i级台阶总共有dp[i]种跳法
vector<int> dp(number+1);
- 根据确定好的dp数组,给出递推公式。
// 根据题目分析我们得出了以下递推公式
dp[i] = dp[i-1] + dp[i-2];
- 确定dp数组是否需要初始化,初始化为多少。
// 根据本题的边界条件,需要特殊处理下标小于3的dp值
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
- 确定遍历的顺序;这一步在背包相关的DP题目中非常重要。
// 本题从小到大遍历即可
for(int i{3};i <= number;++i){
dp[i] = dp[i-1] + dp[i-2];
}
-
根据测试用例进行验证:选择所有的测试用例带入验证即可。
-
完整代码如下:
class Solution {
public:
int jumpFloor(int number) {
if(number <= 2){
return number;
}
vector<int> dp(number+1);
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
for(int i{3};i <= number;++i){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[number];
}
};
当提交成功后,会展示如下界面,那么恭喜这道题目就通过了!
小结
祝愿所有的伙伴都能拿到自己心仪的Offer!????伙伴们点击右边链接立刻开启刷题吧:牛客——刷题网
最后
以上就是雪白荔枝为你收集整理的猿创征文 |【算法面试入门必刷】动态规划-线性dp(一)前言算法入门刷题训练小结的全部内容,希望文章能够帮你解决猿创征文 |【算法面试入门必刷】动态规划-线性dp(一)前言算法入门刷题训练小结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复