当前位置: 首页 > news >正文

猿创征文 |【算法面试入门必刷】动态规划-线性dp(一)

【算法面试入门必刷】动态规划-线性dp(一)

  • 前言
  • 算法入门刷题训练
    • 题目AB34:跳台阶
      • 题目分析
      • 理论准备
      • 题解
  • 小结

📦个人主页:一二三o-0-O的博客
🏆技术方向:C/C++客户端资深工程师(直播+音视频剪辑)
👨‍💻作者简介:数据结构算法与音视频领域创作者
📒 系列专栏:牛客网面试必刷
📣专栏目标:帮助伙伴们通过系统训练,掌握数据结构与算法,收获心仪Offer
📝推荐一个找工作神器:牛客刷题网 【面试经验|实习招聘内推,求职就业一战解决】
🧡如果对您有帮助的话,欢迎点赞👍收藏📂,关注不迷路

【算法入门必刷】数据结构-栈篇系列文章:
【算法入门必刷】数据结构-栈(一)
【算法入门必刷】数据结构-栈(二)
【算法入门必刷】数据结构-栈(三)
【算法入门必刷】数据结构-栈(四)
【算法入门必刷】数据结构-栈(五)
【算法入门必刷】数据结构-栈(六)

【算法入门必刷】动态规划-线性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解题步骤:

  1. 首先要确定dp数组:是一维,二维还是三维;以及下标的含义是什么?
  2. 根据确定好的dp数组,给出递推公式,也叫状态转移方程。
  3. 确定dp数组是否需要初始化,初始化为多少。
  4. 确定遍历的顺序;这一步在背包相关的DP题目中非常重要。
  5. 根据测试用例进行验证

题解

具体的解决方案如下:

  1. 首先确定dp数组:是一维,二维还是三维;以及下标的含义是什么?
// 这里使用一维dp即可
// dp[i] 表示青蛙跳上一个i级台阶总共有dp[i]种跳法
vector<int> dp(number+1);
  1. 根据确定好的dp数组,给出递推公式。
// 根据题目分析我们得出了以下递推公式
dp[i] = dp[i-1] + dp[i-2];
  1. 确定dp数组是否需要初始化,初始化为多少。
// 根据本题的边界条件,需要特殊处理下标小于3的dp值
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
  1. 确定遍历的顺序;这一步在背包相关的DP题目中非常重要。
// 本题从小到大遍历即可
for(int i{3};i <= number;++i){
    dp[i] = dp[i-1] + dp[i-2];
}
  1. 根据测试用例进行验证:选择所有的测试用例带入验证即可。

  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!📣伙伴们点击右边链接立刻开启刷题吧:牛客——刷题网

相关文章:

  • 一整套美团面经(给对象超用心整理的)
  • 【机器学习】鸢尾花数据的基本信息 || sklearn
  • Opencv项目实战:07 人脸识别和考勤系统
  • SpringBoot入门教程:数据库恢复(mysqldump和mysqlbinlog)
  • 内网开发新项目之流程记录
  • 数据分析-numpy2
  • MATLAB | 全网唯一,双变量及三变量映射图表的MATLAB绘制
  • 分布式 | 从 dble 日志分析到 MySQL 源码学习
  • 天呐,我居然可以隔空作画了
  • 【面试】软件自动化测试岗位面试题和答案
  • 氨基功能化离子液体修饰SBA-15(NH2-IL-SBA)|含有烯丙基的离子液体氯化1-烯丙基-3-甲基咪唑(AMIMCl)
  • 【c ++ primer 笔记】第 14章 重载运算符
  • Nginx+Tomcat负载均衡、动静分离集群
  • Linux入门学习 —— 常用的基本命令(下)
  • 11、Java 变量作用域、构造方法官方教程
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Electron入门介绍
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Java反射-动态类加载和重新加载
  • Meteor的表单提交:Form
  • Mithril.js 入门介绍
  • node 版本过低
  • react 代码优化(一) ——事件处理
  • React16时代,该用什么姿势写 React ?
  • React-flux杂记
  • Spring Cloud中负载均衡器概览
  • VuePress 静态网站生成
  • Vue学习第二天
  • windows下如何用phpstorm同步测试服务器
  • 产品三维模型在线预览
  • 高度不固定时垂直居中
  • 说说动画卡顿的解决方案
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 数据库巡检项
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #1014 : Trie树
  • #162 (Div. 2)
  • $(function(){})与(function($){....})(jQuery)的区别
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (¥1011)-(一千零一拾一元整)输出
  • (11)MSP430F5529 定时器B
  • (26)4.7 字符函数和字符串函数
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (备忘)Java Map 遍历
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转载)OpenStack Hacker养成指南
  • **python多态
  • .net core使用RPC方式进行高效的HTTP服务访问