自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 递归、搜索与回溯算法:FloodFill 算法

算法思路:可以利⽤「深搜」或者「宽搜」,遍历到与该点相连的所有「像素相同的点」,然后将其修改成指定的像素即可。全局变量:int m, n;//记录原先的颜色递归函数设计:void dfs(vector<vector<int>>& image,int i,int j,int color)•参数:a.原始矩阵;b.当前所在的位置;c.需要修改成的颜⾊。•函数体:a.先将该位置的颜⾊改成指定颜⾊(因为我们的判断,保证每次进⼊递归的位置都是需要修改的位置);b.

2024-04-24 21:15:46 503

原创 递归、搜索与回溯算法:综合练习

解法:算法思路:⾸先,我们在第⼀⾏放置第⼀个皇后,然后遍历棋盘的第⼆⾏,在可⾏的位置放置第⼆个皇后,然后再遍历第三⾏,在可⾏的位置放置第三个皇后,以此类推,直到放置了 n 个皇后为⽌。我们需要⽤⼀个数组来记录每⼀⾏放置的皇后的列数。在每⼀⾏中,我们尝试放置⼀个皇后,并检查是否会和前⾯已经放置的皇后冲突。如果没有冲突,我们就继续递归地放置下⼀⾏的皇后,直到所有的皇后都放置完毕,然后把这个⽅案记录下来。

2024-04-24 15:21:51 813

原创 C/C++内存管理

申请空间失败,尝试执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施。的共同点是:都是从堆上申请空间,并且需要用户手动释放。在空间上执行析构函数,完成对象中资源的清理工作。在申请的空间上执行构造函数,完成对象的构造。只会开辟空间,不会调用构造函数与析构函数,而。在申请空间后会调用构造函数完成对象的初始化,申请空间时,需要手动计算空间大小并传递,申请和释放的是单个元素的空间,如果申请的是内置类型的空间,

2024-04-20 13:49:57 494

原创 递归、搜索与回溯算法:回溯,决策树

回溯算法是⼀种经典的递归算法,通常⽤于解决组合问题、排列问题和搜索问题等。回溯算法的基本思想:从⼀个初始状态开始,按照⼀定的规则向前搜索,当搜索到某个状态⽆法前进时,回退到前⼀个状态,再按照其他的规则搜索。回溯算法在搜索过程中维护⼀个状态树,通过遍历状态树来实现对所有可能解的搜索。回溯算法的核⼼思想:“试错”,即在搜索过程中不断地做出选择,如果选择正确,则继续向前搜索;否则,回退到上⼀个状态,重新做出选择。回溯算法通常⽤于解决具有多个解,且每个解都需要搜索才能找到的问题。1.回溯算法的模板。

2024-04-19 21:09:33 843

原创 C++类与对象

在传参和传返回值的过程中,一般编译器会做一些优化,减少对象的拷贝,这个在一些场景下还。友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象。如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整。关于编译器生成的默认成员函数,很多童鞋会有疑惑:不实现构造函数的情况下,编译器会。如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如。

2024-04-18 21:00:03 539

原创 递归、搜索与回溯算法:⼆叉树中的深搜

⼆叉树中的深搜深度优先遍历(DFS,全称为 Depth First Traversal),是我们树或者图这样的数据结构中常⽤的⼀种遍历算法。这个算法会尽可能深的搜索树或者图的分⽀,直到⼀条路径上的所有节点都被遍历完毕,然后再回溯到上⼀层,继续找⼀条路遍历。在⼆叉树中,常⻅的深度优先遍历为:前序遍历、中序遍历以及后序遍历。因为树的定义本⾝就是递归定义,因此采⽤递归的⽅法去实现树的三种遍历不仅容易理解⽽且代码很简洁。

2024-04-12 22:04:08 966

原创 递归、搜索与回溯算法:递归

递归在解决⼀个规模为n的问题时,如果满⾜以下条件,我们可以使⽤递归来解决:a.问题可以被划分为规模更⼩的⼦问题,并且这些⼦问题具有与原问题相同的解决⽅法。b.当我们知道规模更⼩的⼦问题(规模为 n - 1)的解时,我们可以直接计算出规模为 n 的问题的解。c.存在⼀种简单情况,或者说当问题的规模⾜够⼩时,我们可以直接求解问题。⼀般的递归求解过程如下:a.验证是否满⾜简单情况。b.假设较⼩规模的问题已经解决,解决当前问题。上述步骤可以通过数学归纳法来证明。

2024-04-11 19:04:24 573

原创 有关栈的算法

解法(栈):算法思路:本题极像我们玩过的「开⼼消消乐」游戏,仔细观察消除过程,可以发现本题与我们之前做过的「括号匹配」问题是类似的。当前元素是否被消除,需要知道上⼀个元素的信息,因此可以⽤「栈」来保存信息。但是,如果使⽤ stack来保存的话,最后还需要把结果从栈中取出来。不如直接⽤「数组模拟⼀个栈」结构:在数组的尾部「尾插尾删」,实现栈的「进栈」和「出栈」。那么最后数组存留的内容,就是最后的结果。

2024-04-05 22:19:55 463

原创 有关字符串算法

解法:算法思路(两两⽐较):我们可以先找出前两个的最⻓公共前缀,然后拿这个最⻓公共前缀依次与后⾯的字符串⽐较,这样就可以找出所有字符串的最⻓公共前缀。

2024-04-05 19:52:06 293

原创 有关哈希表算法

解法(哈希表):算法思路:•如果我们可以事先将「数组内的元素」和「下标」绑定在⼀起存⼊「哈希表」中,然后直接在哈希表中查找每⼀个元素的 target - nums[i],就能快速的找到「⽬标和的下标」。•这⾥有⼀个⼩技巧,我们可以不⽤将元素全部放⼊到哈希表之后,再来⼆次遍历(因为要处理元素相同的情况)。⽽是在将元素放⼊到哈希表中的「同时」,直接来检查表中是否已经存在当前元素所对应的⽬标元素(即 target - nums[i]如果它存在,那我们已经找到了对应解,并⽴即将其返回。

2024-04-05 15:19:08 1026

原创 有关链表算法

解法(模拟):算法思路:两个链表都是逆序存储数字的,即两个链表的个位数、⼗位数等都已经对应,可以直接相加。在相加过程中,我们要注意是否产⽣进位,产⽣进位时需要将进位和链表数字⼀同相加。如果产⽣进位的位置在链表尾部,即答案位数⽐原链表位数⻓⼀位,还需要再 new⼀个结点储存最⾼位。

2024-04-02 21:24:45 421

原创 分治——归并排序算法

解法(归并排序):算法思路:归并排序的流程充分的体现了「分⽽治之」的思想,⼤体过程分为两步:◦分:将数组⼀分为⼆为两部分,⼀直分解到数组的⻓度为 1,使整个数组的排序过程被分为「左半部分排序」 + 「右半部分排序」;◦治:将两个较短的「有序数组合并成⼀个⻓的有序数组」,⼀直合并到最初的⻓度。

2024-03-31 17:35:15 886 1

原创 分治——快速排序算法

解法(快排思想 - 三指针法使数组分三块):算法思路:类⽐数组分两块的算法思想,这⾥是将数组分成三块,那么我们可以再添加⼀个指针,实现数组分三块。设数组⼤⼩为n,定义三个指针◦left :⽤来标记0序列的末尾,因此初始化为-1;◦cur :⽤来扫描数组,初始化为0;◦right :⽤来标记2序列的起始位置,因此初始化为n。在 cur 往后扫描的过程中,保证:◦[0, left] 内的元素都是0;◦[left + 1, cur - 1] 内的元素都是。

2024-03-26 22:36:43 935

原创 模拟算法

算法思路:纯模拟。从前往后遍历整个字符串,找到问号之后,就⽤a ~ z的每⼀个字符去尝试替换即可。

2024-03-26 08:29:40 393

原创 各种排序介绍

基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j]每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

2024-03-25 09:12:40 1028

原创 前缀和算法

解法(前缀和):算法思路:a.先预处理出来⼀个「前缀和」数组:⽤dp[i]表⽰:[1, i]区间内所有元素的和,那么dp[i - 1]⾥⾯存的就是[1, i - 1] 区间内所有元素的和,那么:可得递推公式: dp[i] = dp[i - 1] + arr[i];b.使⽤前缀和数组,「快速」求出「某⼀个区间内」所有元素的和:当询问的区间是 [l, r]时:区间内所有元素的和为:。

2024-03-23 18:46:05 643 1

原创 位运算算法

解法(位图的思想):算法思路:利⽤「位图」的思想,每⼀个「⽐特位」代表⼀个「字符,⼀个int类型的变量的32位⾜够表⽰所有的⼩写字⺟。⽐特位⾥⾯如果是0,表⽰这个字符没有出现过。⽐特位⾥⾯的值是1表⽰该字符出现过。那么我们就可以⽤⼀个「整数」来充当「哈希表」。

2024-03-20 20:46:25 213 1

原创 二分查找算法

3.算法思路:⽤的还是⼆分思想,就是根据数据的性质,在某种判断条件下将区间⼀分为⼆,然后舍去其中⼀个区间,然后再另⼀个区间内查找;⽅便叙述,⽤x表⽰该元素,resLeft表⽰左边界,resRight 表⽰右边界。寻找左边界思路:◦我们注意到以左边界划分的两个区间的特点:▪左边区间 [left, resLeft - 1]都是⼩于x的;▪右边区间(包括左边界) [resLeft, right]都是⼤于等于 x的;•因此,关于 mid的落点,我们可以分为下⾯两种情况:◦。

2024-03-16 17:33:04 823 1

原创 滑动窗口算法

解法⼆(滑动窗⼝):算法思路:让滑动窗⼝满⾜:从i位置开始,窗⼝内所有元素的和⼩于target(那么当窗⼝内元素之和第⼀次⼤于等于⽬标值的时候,就是i位置开始,满⾜条件的最⼩⻓度)。做法:将右端元素划⼊窗⼝中,统计出此时窗⼝内元素的和:如果窗⼝内元素之和⼤于等于target:更新结果,并且将左端元素划出去的同时继续判断是否满⾜条件并更新结果(因为左端元素可能很⼩,划出去之后依旧满⾜条件)如果窗⼝内元素之和不满⾜条件:right++,另下⼀个元素进⼊窗⼝。

2024-03-16 16:36:57 911 1

原创 双指针算法

常⻅的双指针有两种形式,⼀种是对撞指针,⼀种是左右指针。对撞指针:⼀般⽤于顺序结构中,也称左右指针。对撞指针从两端向中间移动。⼀个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼近。对撞指针的终⽌条件⼀般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环),也就是:(两个指针指向同⼀个位置)(两个指针错开)快慢指针:⼜称为⻳兔赛跑算法,其基本思想就是使⽤两个移动速度不同的指针在数组或链表等序列结构上移动。这种⽅法对于处理环形链表或数组⾮常有⽤。

2024-03-16 11:32:53 806 1

原创 贪吃蛇前序(Win32 API 简单介绍)

Windows 这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外, 它同时也是⼀个很⼤的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤(Application), 所以便称之为 Application Programming Interface,简称 API 函数。返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬起;光标外观会变化,范围从完。

2024-01-31 09:50:45 947

原创 双向带头循坏链表的创建

综上可以只需要创建LTInsert和LTErase函数就可以快速创建一个链表。因为为循坏链表,所以需要从头结点的下一个结点开始,到头结点结束。结构体如下,其中储存两个指针,存前一个以及后一个结点的地址。双向带头循坏链表的结构。

2023-12-24 20:42:21 323

原创 单链表创建以及应用

创建链表。

2023-12-17 16:43:00 369 1

原创 C语言文件操作

每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了指针和⽂件的关系。缓冲⽂件系统中,关键的概念是“⽂件类型指针”,简称“⽂件指针”。

2023-12-14 21:38:44 880 1

原创 计算结构体的⼤⼩,结构体内存对⻬

如果我们能保证将所有的double类型的数据的地址都对⻬成8的数,那么就可以⽤⼀个内存操作来读或者写值了。体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。- Linux中 gcc 没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩。2. 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的。对⻬数 = 编译器默认的⼀个对⻬数 与 该成员变量⼤⼩的。4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到。取消设置的对⻬数,还原为默认。

2023-12-02 11:29:10 429

原创 C语言浮点数在内存中的存储

浮点数存的过程。

2023-11-28 21:14:34 855 1

原创 C语言内存函数(memcpy,memmove,memcmp)详解

源空间和⽬标空间出现重叠,使用memcpy和memmove的结果不同,因为memcpy执行过程中会把source的内容改变,进而影响之后的复制,在这种时候就得使⽤memmove函数处理。和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。3.如果source和destination有任何的重叠,复制的结果都是未定义的,即对于自身复制时会出现问题,此时应该使用memmove。功能:memmove的功能和memcpy基本相同,但memmove更强大,适用的范围更广,

2023-11-26 16:07:22 411 2

原创 C语言中strerror以及perror函数详解

函数原型:功能:strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在errno.h这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀错误码都是有对应的错误信息的。

2023-11-25 20:59:57 394

原创 qsort的使用及模拟实现

比较浮点型数据的大小时,对于double类型的数据,一般两个数据的差值小于等于1e-15时可视为相等,因为double类型的数据一般只能精确保存到第15位小数,后面数据会出现误差。float类型的数据同理,一般两个数据的差值小于等于1e-6时可视为相等。- nmemb表示该数组的元素个数。- base指向数组的起始地址,通常该位置传入的是一个数组名。:qsort()函数的功能是对数组进行排序,数组有nmemb个元素,每个元素大小为size。- 此为指向比较函数的函数指针,决定了排序的顺序。

2023-11-18 20:50:12 59 2

原创 位操作符详解以及应用

位操作符详解以及应用

2023-11-07 09:05:14 65 2

原创 C语言扫雷游戏的实现

假设我们排查(8,6)这个坐标时,我们访问周围的⼀圈8个⻩⾊位置,统计周围雷的个数时,最下⾯的三 个坐标就会越界,为了防⽌越界,我们在设计的时候,给数组扩⼤⼀圈,雷还是布置在中间的9*9的坐 标上,周围⼀圈不去布置雷就⾏,这样就解决了越界的问题。我们在棋盘上布置了雷,棋盘上雷的信息(1)和⾮雷的信息(0),假设我们排查了某 ⼀个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那我们需要将排查出的雷的数量信息记录 存储,并打印出来。如果排查位置不是雷,周围也没有雷,不可以展开周围的⼀⽚。

2023-11-03 21:36:36 55 6

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除