剑指offer经典题目整理(二)

一、斐波那契数列(fib)

1.链接

斐波那契数列_牛客题霸_牛客网 (nowcoder.com)

2.描述

斐波那契数列就是数列中任意一项数字,都会等于前两项之和,满足f(n) = f(n-1) + f(n-2) 的一个数列,例如:1 1 2 3 5 8 13 21 ... 

现在题目规定第一项和第二项为1,输入一个整数n,代表第n项,要求返回第n项的结果

3.思路

思路一:动态规划

斐波那契数列是动态规划中最经典简单的一个代表,其中的公式就是动态规划的状态方程,这题也是用来引入简单动态规划问题的一个经典题目

解决动态规划类的问题,需要三步:

第一步是设置状态参数n,本题中的状态参数n代表的就是斐波那契数列的第n项

第二步是根据题目意思去寻找关于n的状态方程,本题的状态方程就是f(n) = f(n-1) + f(n-2)

第三步是确定初始状态,本题中的初始状态题目给出,f(1) = 1 , f(2) = 1

确定好这三步后就可以根据状态方程和初始值去写代码了

思路二:递归与剪枝

第二种解决的思路,其实是分治思想,利用递归的方式,要想知道f(n),就需要知道f(n-1)和f(n-2) 的结果,要知道f(n-1),就要先知道f(n-2)和f(n-3)... 不断向下递归,直到递归到初始值,就可以返回得到结果,但是这种递归会存在大量的重复计算,由于递归会形成新的栈帧,对内存和计算效率的成本都非常大,因此,通过剪枝的方式去减少重复运算,这里的剪枝,就是指,可以将递归过程中,已经计算好的结果,存入到一个容器中,避免重复运算,这里我选择用map容器去实现剪枝操作

4.参考代码

思路一:动态规划

class Solution 
{
public:int Fibonacci(int n) {if(n == 1 || n == 2){return 1;}vector<int> dp;dp.reserve(n+1);dp[0] = 0;dp[1] = 1;dp[2] = 1;for(int i = 3; i<=n;i++){dp[i] = dp[i-1] + dp[i-2];}return dp[n];}
};

代码分析

思路二:递归与剪枝

class Solution {public:int Fibonacci_recursion(int n, map<int, int>& fib) {if (n == 1 || n == 2) {return 1;}int pre = 0;if (fib.find(n - 1) == fib.end())  //没有记录过{pre = Fibonacci_recursion(n - 1, fib);fib[n - 1] = pre;} else {pre = fib[n - 1];}int ppre = 0;if (fib.find(n - 2) == fib.end()) {ppre = Fibonacci_recursion(n - 2, fib);fib[n - 2] = ppre;} else {ppre = fib[n - 2];}return pre+ppre;}int Fibonacci(int n) {map<int, int> fib;return Fibonacci_recursion(n, fib);}
};

二、青蛙跳台阶

1.链接

跳台阶_牛客题霸_牛客网 (nowcoder.com)

2.描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

3.思路

青蛙跳台阶问题,其实就是斐波那契数列的一个变形,也是动态规划的思路去解决,同样是三步

第一步状态定义:设跳到第n台阶一共有f(n)种跳法

第二步状态方程:通过分析,可以发现,第n台阶的跳法,跳到第n阶前,要么在n-1个台阶,要么在n-2个台阶上,第n阶跳法总数会等于n-1台阶的跳法总数+n-2台阶的跳法总数,所以状态方程也就是f(n) = f(n-1) + f(n-2)

第三步初始状态:f(1) = 1,f(2) = 2

4.参考代码

class Solution {
public:int jumpFloor(int number) {vector<int> dp;dp.reserve(number+1);dp[1] = 1;dp[2] = 2;for(int i = 3;i<=number;i++){dp[i] = dp[i-1] + dp[i-2];}return dp[number];}
};

三、矩形覆盖

1.链接

矩形覆盖_牛客题霸_牛客网 (nowcoder.com)

2.描述

我们可以用 2*1 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 2*1 的小矩形无重叠地覆盖一个 2*n 的大矩形,从同一个方向看总共有多少种不同的方法?

3.思路

核心还是斐波那契数列的变形,也是采用动态规划的思路

第一状态定义:用 n 个 2*1 的小矩形无重叠地覆盖一个 2*n 的大矩形,从同一个方向看总共有f(n)种不同的方法

第二状态方程:每次放方块,实际只有两种放置方式,一种是竖着放(放一个),一种是横着放(放两个),类比与青蛙跳台阶一样的思路,最后放置完n个的状态,要么采用竖着放(剩下一个),要么横着放(剩下两个),而放完n个小方块的方法总数就会是这两种状态的方法总数之和

即,f(n) = f(n-1) + f(n-2) 

第三初始参数:f(1)= 1 , f(2) = 2

4.参考代码

class Solution {public:int rectCover(int number) {vector<int> dp;dp.reserve(number + 1);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中,一些关于斐波那契数列以及其变形的经典题目,也是简单的动态规划题目,题目虽然简单,但动态规划的思想比较难,这里算是一个简单的引入,之后还会更加深入的学习动态规划

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/526042.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu平铺左、右、上、下、1/2、1/4窗口(脚本)

前言 之前因为一直在用Ubuntu 18或者Ubuntu 20然后发现装了GNOME插件后&#xff0c;电脑在使用过程中&#xff0c;会时不时的卡死&#xff08;鼠标没问题&#xff0c;键盘输入会有10-20秒的延迟&#xff09;频率基本是一小时一次&#xff0c;因为这种卡顿会很容易打断思路&…

首屏性能优化:提升用户体验的秘籍

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Chrome中如何导出和导入书签

导出书签 如下图所示&#xff1a; 右上角三点->书签和清单->书签管理器->右上角三点->导出书签 然后你选择保存地址即可。打开后如下&#xff1a; 导入书签 如下图所示&#xff1a; 右上角三点->书签和清单->导入书签和设置->选择以前导出的书签&…

存储引擎的详细介绍

通过查询可得&#xff1a; &#xff08;一&#xff09;InnoDB引擎 简介&#xff1a;具备外键支持功能的事务存储引擎 优点&#xff1a; 1.是mysql的默认事务型存储引擎&#xff0c;它被设计用来处理大量短期事务&#xff08;确保事务完整提交和回 滚&#xff09; 2.除了增加…

【数仓】通过Flume+kafka采集日志数据存储到Hadoop

相关文章 【数仓】基本概念、知识普及、核心技术【数仓】数据分层概念以及相关逻辑【数仓】Hadoop软件安装及使用&#xff08;集群配置&#xff09;【数仓】Hadoop集群配置常用参数说明【数仓】zookeeper软件安装及集群配置【数仓】kafka软件安装及集群配置【数仓】flume软件安…

【重新定义matlab强大系列十七】Matlab深入浅出长短期记忆神经网络LSTM

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

19、电源管理入门之微内核中的电源管理

目录 1. QNX电源管理框架 2. QNX客户端API库 3. QNX代码分析 4. Fuchsia中的电源管理 5. Minix中的电源管理 6. Harmony OS中的电源管理 之前介绍的电源管理机制基本都是在Linux中实现的,可以看到很复杂,各种框架,明明一个操作非要转来转去,而且在内核里面实现,跟内…

静态时序分析:SDC约束命令set_multicycle_path详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html 目录 指定多周期值 指定建立/保持时间检查 指定上升/下降沿 指定起点或终点 指定时序路径起点 删除多周期路径 添加注释 单周期时序分析 多周期时序分析 本章将继续上章的步伐&a…

php集成修改数据库的字段

1.界面效果 2.代码 <?phpecho <form action"" method"post"><label for"table">表名:</label><input type"text" id"table" name"table"><br><div id"fieldsContaine…

文本生成视频:从 Write-a-video到 Sora

2024年2月15日&#xff0c;OpenAI 推出了其最新的文本生成视频模型——Sora。Sora 能够根据用户的指令生成一分钟长度的高质量视频内容。这一创新的发布迅速在社会各界引发了广泛关注与深入讨论。本文将围绕本实验室发表于SIGGRAPH AISA 的 Write-a-video和 Sora 展开&#xff…

提示词微调:LLMs适应新任务的强大技术

原文地址&#xff1a;Prompt Tuning: A Powerful Technique for Adapting LLMs to New Tasks 2023 年 10 月 18 日 提示词微调是一种通过训练少量提示参数来使大型语言模型 (LLM) 适应新任务的技术。提示文本添加在输入文本之前&#xff0c;以指导LLM生成所需的输出。由于其高…

深入分析Java线程池——ThreadPoolExecutor

文章目录 Java 线程池概述ThreadPoolExecutor 构造方法线程池拒绝策略工作流程并发库中的线程池CachedThreadPoolFixedThreadPoolSingleThreadExecutorScheduledThreadPool ThreadPoolExecutor 源码分析线程池状态表示获取 runState获取 workerCount生成 ctl 提交任务 execute(…