自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 递归、搜索与回溯——综合(上)

1.定义行、列、九宫格标记数组以及找到可行方法的标记方法,将它们初始化为false。2.定义一个数组来存储每个需要处理的位置。3.将题目给出的所有元素的行、列以及九宫格坐标标记为true。4.将所有需要处理的位置存入数组。

2026-05-09 21:39:32 626 123

原创 C++起始之路——C++11(上)

💁‍♂️个人主页👇。

2026-05-09 21:39:02 944 95

原创 C++起始之路——用哈希表封装myunordered_set和myunordered_map

💁‍♂️👇。

2026-04-25 18:17:09 955 87

原创 C++起始之路——哈希表的实现

若是2^x,那么key%2^x本质相当于保留key的后x位,那么后x位相同的值,计算出的哈希值都是一样的,就冲突了。当key是string/Date等类型是,key不能取模,那么需要给HashTable增加一个仿函数,这个仿函数支持把key转换成一个可以取模的整型,若key可以转换为整型并且不容易冲突,那么这个仿函数就用默认参数即可,若这个key不能转换成整型,就需要自己实现一个仿函数传给这个参数,实现这个仿函数的要求就是尽量key的每个值都参与到计算中,让不同的key转换出的整型值不同。

2026-04-25 18:16:40 938 87

原创 C++起始之路——unordered_map和unordered_set的使用

●unordered_map和map的第二个差异是迭代器的差异,map的iterator是双向迭代器,unordered_map是单向迭代器,其次map底层是红黑树,红黑树是二叉搜索树,走中序遍历是有序的,所以map迭代器遍历是Key有序+去重。●unordered_set和set的第二个差异是迭代器的差异,set的iterator是双向迭代器,unordered_set是单向迭代器,其次set底层是红黑树,红黑树是二叉搜索树,走中序遍历是有序的,所以set迭代器是有序+去重;

2026-04-22 19:12:21 923 71

原创 C++起始之路——封装红黑树实现map和set

●end()如何表示?如下图:当it指向50时,++it时,50是40的右,40是30的右,30是18的右,18到根没有父亲,没有找到孩子是父亲左的那个祖先,这是父亲为空了,那我们就把it中的节点指针置为nullptr,用nullptr去充当end。尤其是set,两个模板参数是一样的。●若当前节点是父亲的右,根据中序左子树->根节点->右子树,当前节点所在的子树访问完了,当前节点所在父亲的子树也访问完了,那么下一个访问的需要继续往根的祖先中去找,直到找到孩子是父亲左的那个祖先就是中序要访问的下一个节点。

2026-04-22 19:11:54 1159 77

原创 递归、搜索与回溯——回溯

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

2026-04-19 15:29:50 635 69

原创 递归、搜索与回溯——二叉树中的深搜

💁‍♂️👇。

2026-04-19 15:28:53 543 76

原创 C++起始之路——红黑树的实现

💁‍♂️👇。

2026-04-16 13:13:45 1136 71

原创 C++起始之路——AVL树的实现

💁‍♂️👇。

2026-04-16 13:13:13 760 80

原创 C++起始之路——map和set的使用

●set的声明如下,T就是set底层关键字的类型●set默认要求支持小于比较,若不支持或者想按自己的需求走可以自行实现仿函数传给第二模板参数●set底层存储数据的内存是从空间配置器申请的,若需要可以自己实现内存池,传给第三个参数。●一般情况下,我们都不需要传后两个模板参数。●set底层是用红黑树实现,增删查效率是O(logN),迭代器遍历是走的搜索树的中序,所以是有序的。

2026-04-11 20:25:27 562 67

原创 递归、搜索与回溯——递归

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

2026-04-11 20:24:47 634 76

原创 C++起始之路——二叉搜索树

树的结构中(节点)除了需要存储还要存储对应的value,增/删/查还是以key为关键字走二叉搜索树的规则进行比较,可以快速查找到key对应的value,key/value的搜索场景实现的二叉搜索树支持修改,但是不支持修改key,修改key破环搜索树性质了,可以修改value。3.若支持插入相等的值,插入值跟当前节点相等的值可以往右走,也可以往左走,找到空位置,插入新节点(要注意的是要保持逻辑一致性,插入相等的值不要一会往右走,一会往左走)●若它的左子树不为空,则左子树上所有节点的值都小于等于根节点的值。

2026-03-31 19:24:23 1355 83

原创 C++起始之路——多态

多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态),主要是运行时多态,编译时多态(静态多态)和运行时多态(动态多态)。编译时多态(静态多态)主要就是我们前面的函数重载和函数模板,它们传不同类型的参数就可以调用不同的函数,通过参数不同达到多种形态,之所以叫编译时多态,是因为它们实参传给形参的参数匹配是在编译是完成的,我们把编译时一般归为静态,运行时归为动态。

2026-03-31 19:23:57 623 78

原创 C++起始之路——继承

继承(inheritance)机制是面对对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特征的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用,继承是类设计层次的复用。

2026-03-27 22:21:30 673 78

原创 优选算法——链表

💁‍♂️👇。

2026-03-24 19:20:05 1115 74

原创 优选算法——分治

三者相加即可。●解决第二个问题,为什么要这样做?再归并排序合并的过程中,我们得到的是两个。

2026-03-24 19:18:38 1067 56

原创 C++起始之路——模板进阶

模板参数分类类型形参与非类型形参。类型形参即:出现在模板参数列表中,跟在class或typename之类的后面的参数类型名称。非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。//定义一个模板类型的静态数组public:private:注意:1.浮点数、类对象以及字符串是不允许作为非类型模板参数的。(只有整形可以,像int、long、无符号整形、bool等)。2.非类型的模板参数必须在编译其就能确认结果。

2026-03-17 22:02:57 1735 66

原创 C++起始之路——stack和queue

stack的文档介绍》《queue的文档介绍》1.队列是一种容器适配器,专门用于在FIFO(先进先出)中操作,其中从容器一段插入元素,另一端提取元素。2.队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾如队列,从队头出队列。3.底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器至少支持一下操作:●empty:检测队列是否为空●size:返回队列中有效元素的个数●front:返回队头元素的引用。

2026-03-17 22:02:30 666 67

原创 C++起始之路——list

list的文档介绍。

2026-03-12 21:54:56 527 69

原创 优选算法——模拟

👇作者其它专栏。

2026-03-11 10:29:55 887 57

原创 优选算法——位运算

👇作者其它专栏。

2026-03-10 17:22:04 536 51

原创 优选算法——前缀和

👇作者其它专栏。

2026-03-01 03:59:50 1590 68

原创 优选算法——二分查找

1.关于什么时候用三段式,还是二段式中的某一个,一定不要强行去用,而是通过具体的问题分析情况,根据查找区间的变化确定指针的转移过程,从而选择一个模板。2.当选择两段式的模板时:●在求mid时,只有right-1的情况下,才会向上取整(即+1,取中间数时)

2026-02-16 01:17:41 1743 51

原创 C++起始之路——vector

vector的文档介绍学习STL需要做到:能用、明理、能扩展。(constructor)构造函数声明接口说明vector()(重点)无参构造构造并初始化n个valvector(const vector& x)(重点)拷贝构造使用迭代器进行初始化构造。

2026-02-07 02:04:53 917 46

原创 C++起始之路——string

●。

2026-02-02 02:09:29 1171 39

原创 优选算法——滑动窗口

👇作者其它专栏。

2026-02-02 02:07:56 1086 27

原创 优选算法——双指针

设两个指针left,right分别指向容器的左右两个端点,此时容器的容积:v=(right-left)*min(height[right],height[left])容器的左边界为height[left],右边界为height[right]。●容器容积的计算方式:设两指针i,j,分别指向水槽板的最左端和最右端,此时容器的宽度位j-i。●若该改变右边界,无论右边界移动到哪里,新的水面的高度一定不会超过左边界,也就是不会超过现在的水面高度,但是由于容器的宽度减小,因此容器的容积一定会变小。

2026-01-21 18:12:34 1324 31

原创 C++起始之路——模板初阶

class 类模板名//类内成员定义public:_size=0;//模板不建议声明和定义分离到两个文件.h.和cpp会出现链接错误//扩容++_size;return 0;

2025-12-19 13:51:47 1660 44

原创 C++起始之路——内存管理

/new/delete和malloc/free最大区别是new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数free(p1);delete p2;//内置类型几乎一样free(p3);delete p4;free(p5);return 0;

2025-12-15 10:35:14 1512 31

原创 C++起始之路——类和对象(下)

无论是否写初始化列表,每个构造函数都有初始化列表;无论是否在初始化列表显示初始化成员变量,每个成员变量都要走初始化列表初始化;public:private:int _hour;public:,_day(day),_t(12),_ref(x),_n(1)private:int _year;int _month;int _day;Time _t;//无默认构造int &_ref;//必须初始化引用//必须初始化常量限定类型的对象int i=0;

2025-12-12 23:41:30 1147 30

原创 C++起始之路——类和对象(中)

说明:C++把类型分为内置类型(基本类型)和自定义类型。内置类型就是语言提供的原生数据类型,如:int/char/double/指针等,自定义类型就是我们使用class/struct等关键字自己定义的类型public://不带参数构造函数Date(){_year=1;_month=1;_day=1;//带参构造函数_year=year;_day=day;//全缺省_year=year;_day=day;private:_year;_month;_day;

2025-12-10 13:46:21 1479 36

原创 C++起始之路——类和对象(上)

●class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或成员函数●为了区分成员变量,一般习惯上成员变量会加一个特殊标识,如成员变量前或后加_ 或m(menber)开头,注意C++中这个并不是强制的,只是一些惯例。

2025-12-06 11:54:01 1312 28

原创 C++起始之路——基础知识

●定义命名空间,需要使用namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等●namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量●C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。

2025-12-02 21:07:29 1415 26

原创 数据结构与算法——排序

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。:即在记录中的某些关键字在排序前和排序后位置保持相对稳定。:数据元素全部放在内存中的排序。:数据元素太多不能同时放在内存中,根据排序过程的要求不断的在内外存之间移动数据的排序。

2025-12-01 14:01:32 1445 30

原创 数据结构与算法——二叉树

树是一种的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。。●有一个特殊的结点,称为根结点,根结点没有前驱结点。●除根结点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<=i<=m)又是一颗结构与树类似的子树。每颗子树的根结点有且只有一个前驱,可以有0个或多个后继。●因此,树是递归定义的。注意:树型结构中,子树之间不能有交集,否则就不是树形结构。

2025-11-25 19:14:01 1522 20

原创 数据结构与算法——栈和队列

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。。栈中数据元素遵循后进先出(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,。出栈:栈的删除操作叫做出栈。。

2025-11-19 13:02:31 1205 18

原创 数据结构与算法——链表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串……线性表在逻辑上是线性结构,也就是说是一条连续的直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

2025-11-16 18:47:05 1577 14

原创 在控制台实现贪吃蛇

在上一篇文章中我们讨论了win32API,可以利用win32API来实现对窗口的控制,像窗口大小、设置窗口名字、获取光标位置等信息由于在上一章中已讲到,因此本章不在提及。在游戏运行过程中,蛇每次吃一个食物,蛇的身体会变长一节,如果我们使用链表存储蛇的信息,那么蛇的每一节就是链表中的每个节点。//设置控制台光标状态。初始化状态,假设蛇长为5,蛇身的每个节点是"●",在一固定位,入(24,25)处开始出现蛇,连续5个结点。printf("用↑,ↆ,←,→,分别控制蛇的移动,F3加速,F4减速");

2025-11-12 21:52:36 1284 13

原创 贪吃蛇前奏曲——win32API

GetAsyncKeyState的返回值是short类型,在上一次调用GetAsyncKeyState函数后,如果返回的16为的short数据中,最高位是1,说明按键的状态是按下,如果最高是0,说明按键的状态是抬起;设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调用SetConsoleCursorPosition函数将光标位置设置到指定的位置。我们可以使用cmd命令来设置控制台窗口的长宽:设置控制台窗口的大小,30行,100列。bVisible,光标的可见性。

2025-11-09 18:01:12 1345 21

空空如也

空空如也

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

TA关注的人

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