个人主页:一二三o-0-O的博客
技术方向:C/C++客户端资深工程师(直播+音视频剪辑)
作者简介:数据结构算法与音视频领域创作者
系列专栏:牛客网面试必刷
专栏目标:帮助伙伴们通过系统训练,掌握数据结构与算法,收获心仪Offer
推荐一个找工作神器:牛客刷题网 【面试经验|实习招聘内推,求职就业一战解决】
如果对您有帮助的话,欢迎点赞收藏,关注不迷路
【算法入门必刷】数据结构-栈篇系列文章:
【算法入门必刷】数据结构-栈(一)
【算法入门必刷】数据结构-栈(二)
【算法入门必刷】数据结构-栈(三)
【算法入门必刷】数据结构-栈(四)
【算法入门必刷】数据结构-栈(五)
【算法入门必刷】数据结构-栈(六)
【算法入门必刷】动态规划-线性dp篇系列文章:
【算法面试入门必刷】动态规划-线性dp(一)
【算法面试入门必刷】动态规划-线性dp(二)
【算法面试入门必刷】动态规划-线性dp(三)
开启刷题,请点击右边链接进行跳转点击这里
描述
一只青蛙一次可以跳上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[i] 表示青蛙跳上一个i级台阶总共有dp[i]种跳法
vector<int> dp(number+1);
// 根据题目分析我们得出了以下递推公式
dp[i] = dp[i-1] + dp[i-2];
// 根据本题的边界条件,需要特殊处理下标小于3的dp值
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
// 本题从小到大遍历即可
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!伙伴们点击右边链接立刻开启刷题吧:牛客——刷题网