自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 unordered_map如何按照second值排序

关键在于需要传递一个cmp函数,使得能够按照second值进行排序,与C语言中的qsort类似。,所以我们可以换个思路,把哈希表中的元素全部提取出来装入容器中,再排序。C++中 是一个无序的关联容器,它。

2024-09-17 09:22:29 81

原创 C++进阶 —— AVL树

AVL树的节点内容包括:1、左右节点的地址;2、平衡因子;3、自身存储的数据;4、父节点的地址。int _bf;// 平衡因子:_kv(kv), _bf(0){}private:public://强制让编译器生成构造函数~AVLTree()private:return;

2024-08-14 15:28:55 1401

原创 C++进阶 map和set

set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的, set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行 排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。set在底层是用二叉搜索树(红黑树)实现的。

2024-08-05 10:23:11 1416

原创 算法 —— 位运算

好好思考一下,一个偶数变成一个奇数需要加一或者减一,在二进制上最直观的表现是最低位是否为1,如果为1那么就是奇数,如果为0那么就是偶数,这样就能够解释if语句里的内容了。在文章最开始提到,异或运算是无进制相加,意味着它只能识别不要进位的那些二进制位,这时候我们把进位和异或运算结合在一起就可以实现不用加减运算符达到两整数之和的目的。这里我们使用一个int类型的变量来存值,可以存32个比特位,二进制位为0表示没出现,1为出现。2、给一个数n,确定它的二进制表示中的第 x 位是0还是1。

2024-08-05 10:22:57 1487 1

原创 算法 —— 递推

同上出栈数始终比入栈大1才为非法,很显然这是一个卡特兰数问题,注意卡特兰数后面数据过大,long long存不下,很显然还需要结合高精度模拟。此题很像斐波那契数列的解决方式,斐波那契数列是指这样一个数列:1,1,2,3,5,8,13,21,34,55,89……,那么我们可以看到,如果要移动到B点,总路程为2n,左图绿色路径为刚好越过约束条件的情况,我们可以看到,绿色非法路径的突出点与橙色路径都不约而同的经过右图蓝色直线,意味着路径。如果一个点从坐标A(0,0)开始移动到坐标B(n,n),

2024-08-01 22:25:34 1808

原创 C++进阶 二叉搜索树

对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二 叉搜索树的深度的函数,即结点越深,则比较次数越多。此为删除的是根节点且根节点左子树为空的情况,直接将右子树的地址赋值给root,让他作为根节点即可,当然根节点右子树为空也是同样操作,如果删除的节点是父节点的左子树,比父亲小,根据性质,左子树所有值都比根小,所以删除节点的右子树也比父节点小,所以成立。如果删除的节点是父节点的右子树,比父亲大,他的右子树比他本身还要大,所以接上后成立。

2024-07-31 18:41:09 1571

原创 算法 —— 暴力枚举

第二看纵向宽发生改变,长重置为1,长为1,宽为2的时候,第一行个数为7个,总共有5 x 7 个,长为2,宽为2的时候 第一行个数为6个,共有5 x 6个……首先是横着的长方形,宽始终为1,长不断发生改变,可以看出长为2的时候,第一行个数为6个,总共有6 x 6个,长为3的时候,总共有6 x 5个……这是一道简单的模拟题,枚举出所有可能情况,不会超过规定时间的,以下附上k

2024-07-25 23:26:35 4948 10

原创 prev_permutation 和 next_permutation

next_permutation的意思是下一个排列,与其相对的是prev_permutation,即上一个排列。prev_permutation要求倒序(降序),即最后一种情况4,3,2,1。他的作用能够将排列后的下一组表示出来,比如我们要输出1,2,3,4所有排列情况。我们附上代码 :(next_permutation需要升序)其中第一个为默认情况:升序,第二个需要传一个仿函数comp。的时候就可以直接使用这两个函数,方便又快捷。

2024-07-25 19:35:00 399

原创 C++进阶 多态

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。在继承中要构成多态还有两个条件必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。

2024-07-24 14:38:15 1423

原创 C++进阶 继承

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保 持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象 程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继 承是类设计层次的复用。public:// 姓名protected:// 年龄private:// 父类定义本质,不想被子类继承// 继承的父类的成员public:// 子类用不了(不可见)

2024-07-22 09:28:57 1378

原创 C++入门 模板(进阶)

优点缺点模板复用了代码,节省资源,更快的迭代开发,STL因此而产生模板会导致代码膨胀问题,也会导致编译时间变长增强了代码的灵活性出现模板编译错误时,错误信息非常凌乱,不易定位错误。

2024-07-19 13:00:32 1550

原创 算法 —— 快速幂

下几层的总目标是让,不是奇数,只把 81 ^ 2 当作 (81 ^ 2) ^ 1。这时候已经不用看成什么分解了,𝑎𝑛𝑠∗=6561 就可完成总目标,b/2 为 0,结束循环。现在 𝑏𝑎𝑠𝑒=𝑎,表示的是,𝑎 ^ 1 = 𝑎,待会 𝑏𝑎𝑠𝑒会发生改变的。,依旧𝑎𝑛𝑠 ∗= 𝑏𝑎𝑠𝑒(base此时为a的四次方)b右移一位后变成0,循环结束。

2024-07-15 22:14:42 2021

原创 算法 —— 高精度(模拟)

通过减法可以利用该函数实现加法中的正数加负数,当然在面对小减大的情况时,需要通过一个比较函数来判断两数的绝对值大小处理完之和直接在最终结果的字符串前头插一个” - "加减法所有可能情况式子形式大小比较结果大小正数a + 正数b两者都大于0大于0正数a + 负数b大于等于0正数a + 负数b小于0负数a + 负数b两者都小于0小于0正数a - 正数b大于等于0正数a - 负数b大于0负数a - 正数b小于0负数a - 负数b小于0负数a - 负数b大于0。

2024-07-13 19:51:29 1691 1

原创 P1065 [NOIP2006 提高组] 作业调度方案

首先纠正一下题目错误,红色框应当为3-1,蓝色框应当为3-2。对同一个工件,每道工序必须在它前面的工序完成后才能开始;在保证约束条件 (1.)(2.)的条件下,尽量靠前插入。同一时刻每一台机器至多只能加工一个工件。

2024-07-12 19:55:30 846

原创 算法 —— 模拟

各位读者有听说过“建模”一词吗?所谓“建模”,就是把事物进行抽象,根据实际问题来建立对应的数学模型。“抽象”并不意味着晦涩难懂;相反,它提供了大量的便利。计算机很难直接去解决实际问题,但是如果把实际问题建模成数学问题,就会大大地方便计算机来“理解”和“解决”。举个生活中常见的例子:我们拿到了某次数学考试的成绩单,现在需要知道谁考得最好。当然不能把成绩单对着电脑晃一晃,然后问“谁考得最好?需要通过一种途径让计算机来理解这个问题。这个问题可以建模成:“给定数组score[],问数组内元素的最大值”。

2024-07-11 15:44:32 559

原创 P5731 【深基5.习6】蛇形方阵

其实每次转都相当于是往右转,所以只需要定义一个改变位置的数组,还有一个变量。,每次转改变一下就行了。注意不能直接改,需要。

2024-07-10 00:06:54 460

原创 lower_bound 和 upper_bound

从首元素开始遍历,如果arr[ i ] + c等于2那么sum就+=right - left,可以理解为前面每个1都是一个个体,他们都可以和后面的两个2 组合。可以理解为lower_bound查找的是左边界的下标位置,upper_bound查找的右边界的下一个下标位置,利用这个特性可以解决此题。第一次查找left返回的是第一个2的下标,right返回的是第一个3的下标,,本题另外要注意的是sum要用long long类型。返回一个迭代器,该迭代器指向范围中比较。返回一个迭代器,该迭代器指向范围中的。

2024-07-09 16:31:29 250

原创 算法 —— 前缀和

需要前n项和直接访问dp前缀和数组的下标位置即可。,这样时间复杂度太高,这时候我们构造一个前缀和数组,将。1 - n区间内各区间的和存入进去。预处理一个前缀和矩阵,将。存在这个dp数组中,通过。如果我们用暴力解法,

2024-07-08 09:55:24 607

原创 算法 —— 二分查找

这道题可以引出另外两个重要的二分查找模板:查找左边界的二分模板 查找右边界的二分模板以上是两个模板的内容,判断条件根据题目内容修改,以题目示例1为例,下面给出具体解释为什么这样做可行:public:// 处理为空// 找左端点else// 判断是否有结果// 找右端点 // left可以从左端点开始elseleft = mid;= -1)else。

2024-07-07 08:53:13 762

原创 C++入门 容器适配器 / stack && queue模拟实现

deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组。我们假设一个buff是10个int大小的空间数组,map中存放了每个buff数组的地址,buff数组用来存放数据,可以理解他从中间开始利用空间,向左右扩容。

2024-07-05 19:05:46 1737

原创 C++入门 stack && queue 介绍及使用

1.stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。empty:判空操作back:获取尾部元素操作push_back:尾部插入元素操作pop_back:尾部删除元素操作。

2024-07-05 16:29:07 989

原创 算法 —— 滑动窗口

如果题目正向思考困难,可以从另外一方面思考,例如本题要找最短长度,且元素可能在左右端口出现,另外最短长度数组元素之和刚好为x,这个代码实现起来过于麻烦,可以想找一个最长长度的子数组,使他元素之和刚好为sum - x,这样又转化为滑动窗口问题。,所以相加会使sum变大,相减会使sum变小,至于为什么可以这样做,这其实是在暴力枚举的基础上进行了优化,例如2,3,1,2相加等于8已经超过target,这样就不需要继续加后面的4,3,因为此时已经满足条件,我们要做的是。,意味着我们要开一个128大小的数组。

2024-07-01 22:53:00 1428

原创 算法 —— 双指针

首先固定最大的数,以一个循环为例,先固定最大数10,左指针指向下标为0的元素(2),右指针指向下标为5的元素(9),a就是2,b就是9,c就是10,a + b > c,那么a——b这个区间里所有数加b都大于c,那么把810看作巢穴,把一次平方和规则看作鸽,经过811次平方和后,会导致810个巢穴不够分,至少有一个巢穴是两个鸽:意味着经过810次以上的平方和规则后,势必出现重复,重复后就进环。right--找到次小的数5,再使left从下标0开始,a + b小于c,那么让left++,使得left变大,

2024-06-29 21:22:47 1180

原创 数学建模 —— 矩阵的运算(上)

这是因为方差和数据原本的量纲(即单位)是不一致的, 对方差的计算公式进行量纲分析容易看出,方差的量纲是原始数据量纲的平方,因此对方差开 根号,得到的标准差的量纲和原始数据的量纲一致。(1)如果A 是一个向量,那么 var(A,w)可以计算A 的方差,当w=0 时,表示计算样本 方 差 ,w=1 时表示计算总体方差,另外,var(A,0) 也可以直接简写为var(A)。以上是A 为向量时的情况,如果A 是一个矩阵,mode 函数也可以有两个返回值或三个返 回值,后两个返回值代表的含义与A 为向量时类似。

2024-06-27 09:50:29 1365

原创 C++入门 list的模拟实现

要模拟实现list,必须要熟悉list的底层结构以及其接口的含义,通过之前学习,这些内容已基本掌握,现在我们来模拟实现list。参照带头双向循环链表的结构,我们可以建立以下三个类来模拟实现list。

2024-06-27 00:27:03 385

原创 数学建模 —— MATLAB中的矩阵(下)

有时候我们需要对多个矩阵进行拼接,变成一个大的矩阵。根据矩阵拼接的方向,我们可 以分为横向(水平)拼接和纵向(垂直)拼接,如下图所示:在MATLAB 中,我们可以使用命令[ A , B ] 或 [A B]对矩阵A 和 B 进行横向拼接,也可 以使用MATLAB中的内置函数:horzcat(A , B); 类似的,我们可以使用命令[A ; B] 对矩阵A 和 B 进行纵向拼接,也可以使用MATLAB中的内置函数:vertcat(A,B)。事实上,horzcat 和 vertcat 两个函数来源自cat 函

2024-06-26 14:30:45 1635 1

原创 数学建模 —— MATLAB中的矩阵(上)

矩阵的创建方法在MATLAB中,矩阵的创建方法主要有三种,分别是:直接输入法、函数创建法和导入本地文件中的数据。(1)直接输入法直接输入法适用于矩阵中元素数量较少的情况。输入矩阵时要以中括号“[ ]”作为标识符号,矩阵的所有元素必须都在中括号内。矩阵的同行元素之间用空格或逗号分隔,行与行之间用分号或回车键分隔。例如:命令a=[123;456];可以在工作区创建出变量名为a 的矩阵(2)函数创建法MATLAB提供了一些函数,这些函数可以用来生成某些特定的矩阵,我们这里介绍几组最常用到的函数。

2024-06-26 12:40:37 1299

原创 C++入门 list的介绍及使用

list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率 更好。与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问。

2024-06-25 11:28:03 524

原创 数学建模 —— MATLAB中的向量

例如,以向量 a [ 2 4 8 16 32 64 128 256 512 1024 ] 我们令 index = [ 1 3 5 7 9 ],那么 a(index)的结果为[2 8 32 128 512],即我们提取了向量a中奇数位置的元素。类似的,我们也可以利用向量的索引来同时提取多个位置的元素,这时候只需要将 index 设置成一个向量,index 中放入我们想要提取的元素的索引,然后使用a(index)命令即可。这个“1×0”指的是向量的维度,你可以理解为1行0列,即这个向量是空的,不存在元素。

2024-06-25 09:17:53 1380

原创 数学建模 —— 常见的数学运算函数

例如sin(pi/6)和cos(pi/3)的计算结果等于0.5, tan(pi/4)的计算结果等于1;如果你要用角度来进行计算,你可以使用 sind 、cosd 和 tand 这一 组函数,例如 sind(30)和 cosd(60)的计算结果等于0.5,tand(45)的计算结果等于1。round(X,N)可以将X在第N位数 四舍五入,分下面三种情况: 1)N>0:四舍五入到小数点右侧。sqrt(a)可以计算a的平方根,即对 a开根号。mod(a,m)可以计算a除以m后的。其结果和a^(1/2)等价。

2024-06-24 13:38:43 1045

原创 LeetCode —— 只出现一次的数字

希望本篇文章对你有帮助,有问题请在评论区指正,感谢阅读。

2024-06-24 08:30:14 527

原创 C++入门 vector深度剖析及模拟实现

在上两篇有关vector的模拟实现中,还有构造,拷贝构造,赋值拷贝以及析构函数没有实现,本篇主要实现四个函数,并探讨memcpy拷贝问题

2024-06-23 11:17:31 1183

原创 C++入门 vector迭代器失效

erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代 器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是没有元素的,那么pos就失效了。迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T *。出错原因:以上操作,都有可能会导致vector扩容,也就是说vector底层原理旧空间被释放掉, 而在打印时,

2024-06-23 09:04:30 597

原创 C++入门 vector部分模拟实现

这里成员变量的iterator可以理解为指针类型,但实际上并不是指针。具体框架就如上vector所示,这里不难发现,vector利用的是模板,意味着vector可以利用string等类型来搭建顺序表。

2024-06-22 18:03:03 349

原创 数学建模 —— 查找数据

• 例如搜索后不想看百度文库的东西,搜索线性规划 filetype:pdf -百度文库。来源B站up主:数学建模BOOM课件。策略中的应用,想找一些相关的。

2024-06-22 15:27:51 840

原创 C++入门 vector介绍及使用

vector的文档介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素,也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小。为了增加存储空间,其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为。

2024-06-15 10:11:22 1310

原创 C++入门 深浅拷贝 & 拷贝赋值优化

浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共 享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以当继续对资源进项操作时,就会发生发生了访问违规。深拷贝:每个对象都有一份独立的资源,不要和其他对象共享。如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给出。一般情况都是按照深拷贝方式提供。

2024-06-13 11:05:18 397

原创 C++入门 string的模拟实现

在string的库中有两个swap,标准库也有swap的实现,这些swap的区别是什么呢?那么 string为什么要实现一个类成员函数swap一个非成员函数swap呢?

2024-06-13 10:46:56 292

原创 C++入门 string常用接口(下)

在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般 情况下string类的+=操作用的比较多,注意,字符串转整型最多只能转42亿一下的(unsigne int)平常不建议使用string转整形。+=操作不仅可以连接单个字符,还可以连接字符串。按照ascii码比较即可,一位一位依次比较。从输入中提取整行字符,直到找到分隔符。或换行符 '\n'为止。

2024-06-11 19:32:58 437

原创 C++入门 string常用接口(中)

这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内 部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高。size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一 致,一般情况下基本都是用size()。resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。这三个相当简单,不过多赘述,注意的是size返回字符串有效字符长度。

2024-06-11 14:41:01 1417

空空如也

空空如也

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

TA关注的人

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