自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

2024-07-19 13:00:32 1524

原创 算法 —— 快速幂

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

2024-07-15 22:14:42 1785

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

通过减法可以利用该函数实现加法中的正数加负数,当然在面对小减大的情况时,需要通过一个比较函数来判断两数的绝对值大小处理完之和直接在最终结果的字符串前头插一个” - "加减法所有可能情况式子形式大小比较结果大小正数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 1643 1

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

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

2024-07-12 19:55:30 818

原创 算法 —— 模拟

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

2024-07-11 15:44:32 530

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

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

2024-07-10 00:06:54 438

原创 P1102 A-B 数对

从首元素开始遍历,如果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 216

原创 算法 —— 前缀和

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

2024-07-08 09:55:24 588

原创 算法 —— 二分查找

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

2024-07-07 08:53:13 732

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

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

2024-07-05 19:05:46 1688

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

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

2024-07-05 16:29:07 953

原创 算法 —— 滑动窗口

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

2024-07-01 22:53:00 1383

原创 算法 —— 双指针

首先固定最大的数,以一个循环为例,先固定最大数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 1165

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

这是因为方差和数据原本的量纲(即单位)是不一致的, 对方差的计算公式进行量纲分析容易看出,方差的量纲是原始数据量纲的平方,因此对方差开 根号,得到的标准差的量纲和原始数据的量纲一致。(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 1297

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

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

2024-06-27 00:27:03 370

原创 数学建模 —— 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 1521 1

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

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

2024-06-26 12:40:37 1135

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

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

2024-06-25 11:28:03 515

原创 数学建模 —— 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 933

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

例如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 1003

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

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

2024-06-24 08:30:14 496

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

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

2024-06-23 11:17:31 1152

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

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

2024-06-23 09:04:30 584

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

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

2024-06-22 18:03:03 338

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

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

2024-06-22 15:27:51 683

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

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

2024-06-15 10:11:22 1301

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

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

2024-06-13 11:05:18 391

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

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

2024-06-13 10:46:56 285

原创 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 428

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

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

2024-06-11 14:41:01 1410

原创 常见排序算法——选择排序(直接选择排序 & 堆排序)

直接选择排序思考非常好理解,但是效率不是很好,实际中很少使用时间复杂度:O(N^2)空间复杂度:O(1)稳定性:不稳定 (不能保证原来所具有的相对次序)堆排序使用堆来选数,效率就高了很多。时间复杂度:O(N*logN)空间复杂度:O(1)稳定性:不稳定 (不能保证原来所具有的相对次序)

2024-06-09 15:47:11 260

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

string是表示字符串的字符串类该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。string在底层实际是:basic_string模板类的别名,typedef basic_string string;不能操作多字节或者变长字符的序列。在使用string类时,必须包含#include以及using namespace std;

2024-06-09 11:22:12 589

原创 常见排序算法——插入排序(直接插入排序 & 希尔排序)

元素集合越接近有序,直接插入排序算法的时间效率越高时间复杂度:O(N^2)空间复杂度:O(1)稳定性:稳定 (遍历数组不会改变相同元素的相对顺序)希尔排序是对直接插入排序的优化。当gap > 1时都是预排序,目的是让数组更接近于有序;当gap == 1时,数组已经接近有序的了。时间复杂度:O(N ^ 1.25)~O(1.6 * N ^ 1.25)空间复杂度:O(1)稳定性:不稳定 (相同元素在排序过程中被移动)

2024-06-08 07:13:28 490

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

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供 调用。因为在编译期间,当编译器看到该实例化时,需要推演其实参类型通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T, 编译器无法确定此处到底该将T确定为int 或者 double类型而报错。类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟< >,然后将实例化的类型放在< > 中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

2024-06-07 17:01:50 689

原创 C++入门 内存管理

目录C/C++内存分布程序内存实战测试 C语言中动态内存管理方式C++内存管理方式new/delete操作内置类型new和delete操作自定义类型自定义类型变量自定义类型数组operator new与operator delete函数new和delete的实现原理定位new表达式(placement-new)malloc/free和new/delete的区别在正式开始记笔记前,先巩固一下基础:在C/C++程序内存划分如下图所示: globalVar、staticGlobalVar、staticVa

2024-06-06 11:09:02 707

原创 C++入门 友元 & 编译器优化

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以 友元不宜多用。友元分为:友元函数和友元类。

2024-06-04 22:27:50 629

原创 C++入门 初始化列表 & 隐式类型转换

构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值 的构造函数,还具有类型转换的作用。即用explicit修饰构造函数,将会禁止构造函数的隐式转换。

2024-06-03 23:49:04 1658

原创 C++入门 类--赋值运算符重载(下)

此处用假设法,默认this是max,d是min,两者相减是正值(flag调整正负),如果假设错误,就改变,flag置为-1,然后min++知道min和max相等为止,n与min同时++,返回值就是n * flag。为了区分,构成重载,给后置++,强行增加了一个int形参。注意:前置++后的()不用给参数,后置++后的()需要给一个int,此处的int只是为了区分前置++和后置++,int可以为任意值,也可以不传值。因此不修改成员的都可以在函数后面加上const(只有++,+=,--,-=不能修改)

2024-06-02 18:52:02 788

原创 C++入门 类--赋值运算符重载(上)

出了作用域,返回对象还在没有析构,那就可以用引用返回,减少拷贝返回对象生命周期到了,会析构,传值返回返回对象生命周期没到,不会析构,传引用返回。

2024-06-01 14:12:58 612

原创 C++入门 类--拷贝构造函数

若未显式定义,编译器会生成默认的拷贝构造函数。默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。简单来说,没有开辟空间,直接拷贝成员值的过程叫做浅拷贝,如Time / Date;构造函数开辟空间,拷贝时候需要拷贝相同大小的空间复制值的过程叫做深拷贝,如TreeNode / Stack如果没有管理资源,一般情况下不需要写拷贝构造,默认生成的拷贝构造即可,如Date如果都是自定义类型成员,内置类型成员没有指向资源,默认生成的拷贝构造即可,如MyQueue。

2024-05-30 15:57:17 446

空空如也

空空如也

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

TA关注的人

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