剑指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.mzph.cn/news/733476.shtml

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

相关文章

CPU卡学习

外部认证主要流程&#xff1a; 1. 选卡 2. 发送RATS指令(0xe0 0x51 0x35 0xb4) 3. 成功后返回ATS &#xff1a;0x10 0x78 0x80 0xa0 0x2 0x20 0x90 0x0 0x0 0x0 0x0 0x0 0x38 0xc1 0x5f 0x3e 4. 发送选择MF指令(0xa 0x1 0x0 0xa4 0x0 0x0 0x2 0x3f 0x0 0xbf 0xeb) 5. 成功…

VMware虚拟机安装Ubuntu kylin22.04系统教程(附截图详细步骤)

一、版本信息 虚拟机产品&#xff1a;VMware Workstation 17 Pro 虚拟机版本&#xff1a;17.0.0 build-20800274 ISO映像文件&#xff1a;ubuntukylin-22.04-pro-amd64.iso 二、安装步骤 打开虚拟机&#xff0c;点击创建新的虚拟机&#xff1a; 选择自定义&#xff1a; 硬…

HarmonyOS NEXT应用开发之MpChart图表实现案例

介绍 MpChart是一个包含各种类型图表的图表库&#xff0c;主要用于业务数据汇总&#xff0c;例如销售数据走势图&#xff0c;股价走势图等场景中使用&#xff0c;方便开发者快速实现图表UI。本示例主要介绍如何使用三方库MpChart实现柱状图UI效果。如堆叠数据类型显示&#xf…

嘉绩咨询:搭建品牌招商桥梁,提供卓越讲师与会议服务

当下&#xff0c;品牌成功的关键在于强大的渠道支撑和高效的招商能力&#xff0c;在这一背景下&#xff0c;嘉绩咨询&#xff0c;这一专注于渠道招商全案系统孵化的知名平台型企业&#xff0c;今日宣布&#xff0c;将进一步加强其在品牌招商桥梁搭建上的服务功能&#xff0c;通…

HTML 学习笔记——标签创建小技巧

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Emmrt工具</title></head><body>&…

未来 AI:引领研发技术的关键

2024 年 AI 辅助研发趋势 2024年&#xff0c;随着人工智能技术的不断发展&#xff0c;AI辅助研发正成为科学研究和创新的重要驱动力。在这一年&#xff0c;我们预见到以下几个重要的AI辅助研发趋势。 首先&#xff0c;自动化实验将成为研发领域的主流。AI将在实验室中扮演越来…

XS2185:八通道PSE控制器产品

八通道PSE控制器产品-XS2185 芯片特性 八通道PSE 支持标准PD供电 支持非标PD供电 每个端口功率最大30W 12位端口电流监测 12位电源电压监测 支持直流负载断开检测 支持LED供电状态指示 支持过流保护 支持短路保护 Sifos基本测试通过 32-PIN…

L1-030 一帮一

“一帮一学习小组”是中小学中常见的学习组织方式&#xff0c;老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作&#xff0c;即在得到全班学生的排名后&#xff0c;在当前尚未分组的学生中&#xff0c;将名次最靠前的学…

每日一问之Java中的类加载机制

Java中的类加载过程分为 加载、链接、初始化 三个步骤 加载&#xff1a;将类的字节码文件加载到内存中 链接可以细化分成 验证、准备、解析 验证&#xff1a;检查类的字节码是否符合Java的语法规范 准备&#xff1a;为类的静态变量分配内存并设置初始值 解析&#xff1a;将类…

自动备份数据到异地服务器(另一台电脑)

我们经常遇到需要将数据备份到另一台服务器&#xff0c;但是没有免费的软件&#xff0c;所以很苦恼&#xff0c;去网上找&#xff0c;找来找去都要收费&#xff0c;关键还是月租或年租。。。 其实没必要去买别人的&#xff1b; 下面我给大家写了一个批处理&#xff0c;即可以搞…

【Linux】CentOS网络故障排查大揭秘: 实战攻略解读

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 检查网络连接状态&#xff1a; 检查网络配置&#xff1a; 重启网络服务&#xff1a; 检查防火墙设置&#xff1a; 查看日志文…

VBA技术资料MF128:批量创建文件夹及子文件夹

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

基于SpringBoot+MYSQL的网页时装购物系统

目录 1、 前言介绍 2、主要技术 3、系统流程分析 3.1、系统登录流程图 3.2、添加信息流程图 3.3、删除信息流程图 4、系统体系结构 4.1、时装购物系统的结构图 4.2、登录系统结构图 4.3、时装购物系统结构图 5、数据库设计原则 5.1、管理员信息属性图 5.2、用户管…

2024038期传足14场胜负前瞻

2024038期售止时间为3月10日&#xff08;周日&#xff09;20点30分&#xff0c;敬请留意&#xff1a; 本期深盘多&#xff0c;1.5以下赔率3场&#xff0c;1.5-2.0赔率2场&#xff0c;其他场次是平半盘、平盘。本期14场整体难度中等偏上。以下为基础盘前瞻&#xff0c;大家可根据…

第二十五章 :Docker Compose插件快速安装

第二十五章 :Docker Compose插件快速安装 文章目录 前言一、安装步骤二、卸载三、参考文献Docker version 25.0.3, build 4debf41 ,Docker Compose version v2.24.2说明:上述文件对Docker与Docker Compose有版本的对应关系进行了匹配。 前言 国内大部分情况下,因为网络问题…

node面试知识

01node和浏览器有什么区别和联系&#xff0c;及node进行服务端开发的本质 Node.js和浏览器在JavaScript运行环境方面存在一些区别和联系。 区别&#xff1a; 运行环境&#xff1a;Node.js是一个服务器端JavaScript运行环境&#xff0c;而浏览器是一个客户端JavaScript运行环…

洛谷 8753.小平方

对于这道题来说就直接模拟就行了。 需要注意的一点就是:我们需要判断偶数和奇数的问题。 当我们遇到奇数的时候&#xff0c;在比较这个数的一半的时候&#xff0c;我们需要在/2的基础上1&#xff0c;这样才能过测试点。 上代码&#xff1a; #include<iostream> #incl…

Redis介绍

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是…

Day28:安全开发-JS应用原生开发JQuery库Ajax技术前端后端安全验证处理

目录 JS原生开发-文件上传-变量&对象&函数&事件 JS导入库开发-登录验证-JQuery库&Ajax技术 JS导入库开发-逻辑购买-JQuery库&Ajax技术 实例测试-某违规APP-密码找回&JS验证逻辑安全 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&…

c语言实现http协议服务器端和客户端

本代码参考https://blog.csdn.net/ymxyld/article/details/124812731思路&#xff0c;并添加了客户端代码。 代码各个函数注释写的非常详细&#xff0c;仅供学习参考&#xff0c;有任何疑问请留言。 服务器端 代码流程&#xff1a; #define SERVER_PORT 8080 //设置端口号 …