自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 动态规划算法专题八--背包问题

dp[i][j]:从前i个元素中选择,在所有的选择中,能否凑成j这个数字。dp[i][j]:前i个物品中,体积正好为j的最大价值。问题转化为:能否在数组中,选择一些元素,凑成num/2?dp[i][j]:前i个物品中,体积不超过j的最大价值。2、再问,正好装满体积V,最大价值为多少?自己认真画图分析,仔细思考过程。1、最多能装多大价值的物品?给n个物品,有体积和价值。分类讨论,i物品是否选择。分类讨论,i物品是否选择。

2024-07-21 00:41:25 141

原创 动态规划算法专题七--两个数组dp问题

状态方程:dp[i][j]:nums1序列[0,i]区间和nums2序列[0,j]区间,有多少个不相交线。状态方程:dp[i][j]:表示s1字符串[0,i]区间和s2字符串[0,j]区间,最长公共子序列。根据方程进行推导:分两种情况讨论当s1[i] == s2[j] / s1[i]!根据方程进行推导:分两种情况讨论当s1[i] == s2[j] / s1[i]![0,i]区间的s串,有多少个[0,j]区间的t串。[0,i]区间的s串,有多少个[0,j]区间的t串。dp[i][j]:表示。

2024-07-16 23:09:04 152

原创 动态规划算法专题六--回文串问题

dp[i][j]:区间[i, j]的字串是否是回文子串。例如dp[0][3]就表示0-3的字串,如果是回文串,就true,不是就false。如果[j,i]是回文,就要看前面的部分需要割几刀;dp[i][j]:表示以[i, j]区间的字串是否是回文字串。dp[i]:把[0,i]区间的字串变成回文串的最少分割次数。设立一个j: 0

2024-07-16 01:17:43 273

原创 动态规划算法专题五--子序列问题

二是长度大于1,len[i] = max(len[j] + 1, len[i]);//j是[0, i-1]区间的位置。count[i]:表示,以i位置元素为结尾的所有递增子序列中,最长递增子序列的个数。二是长度大于1,此时i要能跟在j后面,必须满足:nums[i] > nums[j]len[i]位置记录的是最长序列长度,当i和前面的j构成的长度也等于len[i]时。len[i]:表示,以i位置元素为结尾的所有递增子序列中,最长递增子序列的长度。而是count[i] = count[j] #新的序列的个数。

2024-07-15 00:49:46 602

原创 C++ 异常

1、首先检查throw本身是否在try块内部,(我自己抛,我就在原地处理)如果是,则在再检查匹配的catch。异常是一种处理问题的方式,当一个函数发现自己无法处理的错误时,就可以抛出异常,告诉你错了什么,错在哪里,然后让函数的直接/间接调用者来处理这个错误。3、抛出异常的对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个局部对象,5、实际中抛出和捕获的匹配原则有个例外,并不都是类型完全匹配的,可以抛出的派生类对象。3、如果到了main函数的栈帧,依旧没有匹配的catch,就会终止程序。

2024-07-14 17:25:51 823

原创 动态规划算法专题四--子数组系列问题

但是,如果nums[i]是一个负数,dp[i-1]是一个最大值,那么最大值×负数,直接变成最小值。长度大于1时,以i结尾,就是要包括前面i-1位置的和,即dp[i-1] + nums[i]长度大于1时,以i结尾,就是要包括前面i-1位置的和,即dp[i-1] * nums[i]长度大于1时,以i结尾,就是要包括前面i-1位置的和,即f[i-1] + nums[i]长度为1时,以i结尾,就是i位置的值,即nums[i]长度为1时,以i结尾,就是i位置的值,即nums[i]

2024-07-11 23:37:56 969

原创 动态规划专题一 斐波那契数问题

返回 dp[n],因此要多创建一个位置的空间,同时由于结果可能很大,要对 dp[n] 模 1000000007 取余。定义 dp[i] 数组中的值到底表示什么意思:dp[i]的值,就是以i为结尾的编码串的最多解码方式。例如说,我要求dp[0]/dp[1]位置的值,需要前面的位置,但是此时明显已经越界。状态方程是dp[i] = dp[i-1] + dp[i-2] + ap[i-3];因为他们需要前面三个位置的值,如果不初始化,会越界。

2024-07-10 16:59:18 702

原创 动态规划算法专题三--多状态dp问题

对于F表来说,第一个位置是选择该位置,即为该位置的值;选择i位置:因为不能相邻,所以dp[i] = g(i-1) 就是不选择i-1位置。选择i位置:因为不能相邻,所以dp[i] = g(i-1) 就是不选择i-1位置。dp[i]的值,根据题目,有两种选择:选择当前i位置,或者不选择当前i位置。dp[i]的值,根据题目,有两种选择:选择当前i位置,或者不选择当前i位置。不选择i位置:那么对于i-1位置,又有两种选择:选i-1位置或者不选。不选择i位置:那么对于i-1位置,又有两种选择:选i-1位置或者不选。

2024-07-10 16:57:42 509

原创 动态规划算法专题二--路径问题

根据状态转移表,每一个位置的dp值,dp[i,j] = max(dp[i-1,j] ,dp[i,j-1]) + g[i-1][j-1],即上边位置和左边位置的最大值。根据状态转移表,每一个位置的dp值,dp[i,j] = min(dp[i-1,j] ,dp[i,j-1]) - d[i][j]每一个位置的dp值,等于dp[i,j] = dp[i-1,j] + dp[i,j-1],即上边位置和左边位置的和。所以,dp[i,j] = max(dp[i-1,j] ,dp[i,j-1]) + g[i-1][j-1]

2024-07-10 16:56:53 1281

原创 计数排序算法

那么,如果是开出一组绝对映射的count数组,那么前面的99999空间就是纯粹的浪费。//吧对应的值放在对应的位置,非常巧妙、计数排序:用一个数组记录按原始数据中,每个数据出现的次数。从左到右,依次打印次数个数据,打完数据,整个排序就好了。2、不适合浮点数、字符串、结构体等数据排序,只适合整数。1、不适合数据很分散的数据序列,更适合比较集中的数据。同时,相对映射正好可以完美的解决负数的问题。在现实生活中,一般比较的都是结构体。然后从计数的数组中,往回覆盖数据。非常牛批的思路,没有用到比较。

2024-07-02 22:02:30 352

原创 贪心算法算法,完全零基础小白教程,不是计算机的都能学会!超详解

什么是贪心算法?贪心算法不是一个具体的算法,而是一个策略。具体的策略是:1、把解决问题的过程氛围若干步2、解决每一步,都选择当前看起来“最优”的解法3、最后希望得到一个全局最优解。

2024-07-02 21:56:46 950

原创 动态规划算法,完全零基础小白教程!学不会博主退出生物圈!万字吐血详解。

首先,什么是动态规划?很简单,就是动态的规划。呃.....概念名不要紧,重要的是理解其算法思想,并且能够灵活的运用其思想和方法来处理和解决现实生活中的问题,即改造世界。动态规划的思想,具有很强的抽象性,例如什么重复子结构、最优子结构等等,你一听就晕了,这什么玩意?一般来说,学校的课程教学,很学院派。通常是直接灌输式的给你一个世界观和方法论,然后直接让你去屠龙。这个是一个超越经验的东西,直接给你了。但是,我们并不能理解这个结论,因为太抽象。

2024-07-02 21:39:30 1132

原创 C++11标准-详解

转移构造函数(Move Constructor)是 C++11 中引入的一个特殊构造函数,用于实现移动语义移动语义允许在不进行深拷贝的情况下将资源(如动态分配的内存)从一个对象转移到另一个对象。而且,有时候我们希望在函数中传递参数给其他函数时,能够保留原始参数的类型和属性,即使它是一个临时对象(右值)或者一个具名对象(左值)。对于右值来说,既然你是一个即将被销毁的值(右值),没用了。拷贝初始化可能会导致不必要的对象复制,特别是在某些情况下,例如临时对象的创建和销毁,以及不必要的复制操作。

2024-06-05 17:17:53 645

原创 通俗易懂->哈希表详解

什么是哈希表?哈希表,顾名思义,就是一个表。可是为什么叫哈希表?因为这是从老美哪里音译过来的叫做->Hash Table翻译过来就是->哈希表既然是表,那么第一,这个哈希表长什么样子?第二,为什么会有这个哈希表?第三,这个哈希表用来做什么?第三,这个哈希表的特点是什么?第四,什么是取余法?第五,什么是映射?第六,什么是线性探测?第七,什么是哈希桶?一些常见的概念,是什么?要怎么理解?下面一一我来解析。综上,我们来总结一下:1、值很分散,因此哈希表也叫做散列表。

2024-06-01 13:06:35 1215

原创 红黑树底层封装map、set C++

map和set底层都是红黑树,其行为都是一致的,问题在于节点数据类型的不同,所以,红黑树的底层迭代器实现都是一样的,设置为模板,因此和问题1的解决思路是一致的。我map要的是key-value模型的BRTree,所以传的是对应的BRTree传对应的模板到Node,实现不同类型的Node节点。模板写成一样的,功能是一样的,但是不同的对象类具体实现不同的功能。我set要用的是key模型的BRTree,所以传的是在各自的map和set写好各自的类,用于模板仿函数的实例化。

2024-05-15 21:08:20 936

原创 双指针算法

因此在移动之前,我们需要知道复写完成后,哪一个数据是数组最后位置,找到这个位置之后,就可以从该位置开始,从后往前遍历:不是0,往后移动,是0,后面往前两个位置都是0。思路:四数之和,就是三个数之和再加上第四个数字,可以划分区间;这个题目主要在于去重,单趟的去重,就是看left和right前后有没有出现重复;思路:先排序,然后分成两个区间:右边的left-right区间,找到和i位置数相加等于0的配对。主要的思想,就是划分数组区间,只要是数组区间,或者某个区间,都可以尝试使用这种思想解决。

2024-05-13 10:07:41 937

原创 带你手撕红黑树! c++实现 带源码

4、如果对于每个节点,从该节点到其后代节点的简单路径上,均包含相同数目的黑色节点(每条路径的黑色节点数量相等)那么作为另外一条路径的叔叔节点,也必须变为黑色,也增加一个黑色节点,才能保持。3、如果一个节点是红色的,则他的两个孩子是黑色的(不存在连续的红色节点)如此,以祖父节点作为根节点的这棵子树已经保持了黑色节点数量不变。那么,对于祖父作为根节点的这课子树来说,多了一个黑色节点。父节节点变为黑色,父亲节点的路径黑色节点多了一个。而,父节点的父节点,即祖父节点一定存在且为黑色。

2024-05-12 23:09:09 974

原创 C++ list介绍(迭代器失效)

reverse逆置sort排序(默认升序)仿函数greatermerge合并,可以全部合并,也可以一部分合并unique:去重(先排序,再去重)remove:删除e值,而不是erase的pos位置删splice(粘接):其实就是transform(转移)把某个位置i,转移到当前链表的某个position之前list的sort效率很低,底层用归并,但是数据访问很低,因为是链表vectror的sort更好一些,因为是连续的空间。

2024-05-08 15:10:15 788

原创 692. 前K个高频单词 、KY264 单词识别

【代码】692. 前K个高频单词。

2024-05-08 11:20:20 165

原创 c++虚函数

友元函数不可以设置为虚函数,构造函数也不可以,因为虚表在初始化列表初始化,即调用构造函数之后才有的虚函数。内联函数也不可以设置为虚函数,虚函数是函数指针和函数体的分离,而内联没有指针,不用call。静态函数不可以设置为虚函数,静态函数是全局,不属于任何对象,虚函数却属于类对象,冲突。重写:基类虚函数必须写virtual,派生类可以不写virtual。析构函数可以设置为虚函数。虚表是在编译时生成的。一个类可以有多个虚表。

2024-05-06 22:05:35 94

原创 c++基类与派生类

基类对象不可以赋值给派生类,因为派生类有自己的部分,基类没有,内存不匹配。当派生类被赋值给基类对象时,会切片,将符合基类部分切给基类对象。派生类对象可以直接访问基类的public/protect成员。如果继承多个基类,派生类的虚函数放在第一个继承的基类虚表中。基类对象的引用/指针可以指向派生类对象,但是反过来不可以。派生类的对象模型:基类的虚表+基类的成员+自己的成员。静态成员不包含在任何一个类对象中。

2024-05-06 21:20:07 93

原创 带你手撕AVL树 平衡搜索树! c++ (附原码)

当parent为-2时,说明左子树高度高,插入的左子树,此时cur必定为-1;当parent为2时,说明右子树高度高,插入的右子树,此时cur必定为1,需要左旋。b、父亲平衡因子==1/-1,父亲所在子树高度变化,需要往上更新祖先平衡因子。c、父亲平衡因子==2/-2,父亲所在子树已经不平衡,需要旋转处理。因为,插入前的AVL树本身就是一个平衡树,平衡因子都是0/-1/1。当父节点的平衡因子出现2/-2的时候,就不符合AVL树平衡,需调整。1、原来为0,插入左边,--,变为-1,高度变化为-1。

2024-05-06 11:50:43 1356

原创 带你手撕BSTree二叉搜索树! c++ (附原码)

有两种情况:1、删除叶子节点2、删除非叶子节点1)删除带有一个孩子的节点(左/右)可以把删除叶子节点一同处理,即叶子节点不需要特殊处理为什么?删除带有一个孩子的节点其父节点都要链接上该节点的左孩子/右孩子如果是叶子节点,那么左孩子/右孩子是空,就直接连接上了除了以上的正常情况还需要考虑删除的是根节点也就是单支树的情况此时也要特殊处理2)删除带两个孩子的节点找右子树的最左边节点又分两种情况:a、没有最左节点b、有最左节点总之,画图!画图!画图!自己分析。

2024-05-05 20:32:07 610

原创 c++反向迭代器

STL设计的时候,设计为rebegin位置在end位置(和begin、end对称),解引用时,要向前一个位置。反向迭代器厉害之处在于:你给我一个正向迭代器,我就给你一个反向迭代器。而所有的反向迭代器的行为,只和正向有区别,就是++和--的方向相反。你传vector的迭代器,我生成vector的反向迭代器。所有的迭代器,逻辑都是相同的。所以,可以使用模板,实例化为对应适配器的正向迭代器。也就是使用原来的类的正向迭代器来复用实现反向迭代器。你传list的迭代器,我生成list的反向迭代器。

2024-05-05 17:12:57 286

原创 c++set和map

序列式容器:vector、list、deque....单纯的存储数据,数据和数据之间没有关联关联式容器:map、set.....不仅仅是存储数据,一般还可以查找数据,数据之间有强关联。

2024-05-04 16:58:35 653

原创 c++多态

存在虚函数,多开辟一个虚表指针虚函数存在常量区(即代码段)虚表存在常量区(即代码段)虚表是在构造函数初始化列表部分进行初始化的多态:要求父类指针/引用调用,虚函数重写进而实现:编译时,父类有父类的虚表子类有子类的虚表进而实现:运行时,指向父类,到父类的虚表中找,调用父类虚表中的的虚函数指向子类,到子类的虚表中找,调用子类虚表中的的虚函数重载:重载是函数的重载,是在同一个域内实现的构成的条件是函数名相同,但是参数不同,返回值不同并不构成重载。

2024-05-04 10:34:30 1158

原创 c++继承

父类的private子类都不能用,其余public和protect要和子类的继承方式比较,那个小取那个原则:构造保证先父后子析构保证先子后父常见复用的体现:1)函数逻辑的复用2)模板的复用3)继承的复用在实践中,可以设计多继承但是不要设计出菱形继承的结构(iostream的io流就是使用菱形继承)菱形继承是在2.0版本出现的到了3.0才出现的既然会出现歧义问题为什么不删掉呢?因为要兼容以前的历史版本,即向前兼容所以,只有解决,不能删除。

2024-05-03 23:28:30 446

原创 C++静态数组和C语言静态数组的区别( array,int a[])

一、区别C语言的静态数组int a[];

2024-05-02 13:35:10 349

原创 C++模板进阶

2、理解一般传常量使用宏但是利用宏有一个致命缺点:就是不可改变例如,我要一个10个大小的数组,如果宏是10还好说如果我要的是20呢?1000000000呢?宏无法解决,要解决,只有再写一个类而有了非类型模板参数,就可以了。数组参数为N你传N的参数为10,就开辟10个空间你传N的参数为100000,就开辟100000个空间那么,它是这么解决呢?事实上,本质上还是生成了多个类你传10,编译器生成10的类你传1000,编译器生成1000的类...

2024-05-02 13:27:23 1354

原创 C++ 仿函数

仿函数仿函数,顾名思义就是模仿函数模仿了函数的什么呢?

2024-05-02 10:09:45 662

原创 155最小栈,150逆波兰表达式

【代码】155最小栈,150逆波兰表达式。

2024-05-01 23:29:24 18

原创 C++ 优先级队列priority_queue

底层使用的是堆实现,默认为大堆。

2024-05-01 22:41:01 622

原创 C++ stack、queue以及deque

严格来说栈和队列的实现是容器适配器1、常用接口:栈:top、push、pop、size、empty队列:top、push、pop、swap、size、empty。

2024-05-01 15:37:02 359 1

原创 C++ new简介和内存管理

因此,为了解决malloc失败返回空的问题,用operator new对malloc进行封装处理,如果失败抛出异常。operator new是对malloc的封装,解决的是malloc失败不会抛出异常的问题,为了实现new。(因此,再设计一个new,同时,对于内置类型的处理也更加方便,malloc不会调用构造函数,不能初始化)a、当我们对类显示自定义一个析构函数,在new对象的时,会多new四个字节,存储对象的个数。因为,指针位置本应该是往前四个字节,但是现在没有,释放位置错了,报错。

2024-04-24 17:27:55 597

原创 STL::string简单介绍

标准模板库 STL(Standard Template Library),主要是数据结构和算法的框架,是模板库的一部分,STL是一个规范,是一个实现要求,但是并没有要求实现细节.

2024-04-21 12:28:43 404

原创 vector简单介绍

kw=vector。

2024-04-21 12:14:35 935

原创 Linux下git维护

gitignore:有些文件我就不想同步到本地和远端,那么将对应的后缀的文件全部放到该文件中。所以,如果你不想将某些后缀文件传送到远端,就可以在文件内配置相关的后缀信息。因为对应git来说,本地和远端维护是同步的,所以双方的通信地位是对等的。在进行git.add的时候,只是把变化的部分存到本地仓库的暂存区。而commit则是将暂存区的变化部分,加载到git本地仓库。对源代码的历史修改进行维护,保留历史的所有修改痕迹。而git push实际是将本地的修改同步到远端仓库。git是工具,github是网站。

2024-04-17 23:29:40 398

原创 操作系统再理解

当检测到键盘、鼠标等硬件时,操作系统就读取对应硬件的数据属性,先描述对象,设置为节点,然后将各个硬件的对象节点给组织起来。可是那么多学生,张三、李四、王五、赵六、田七、丘八、老九、、、假如说有5万名学生。形态各不相同,怎么管理?因为硬件是操作系统管理的,如果你可以直接访问硬件你,绕过了操作系统,就有可能对操作系统的硬件管理产生影响。对软硬件进行管理(手段),为用户提供一个良好(稳定的、安全的、高效的)的运行环境(目的)例如,学生比较重要的数据有:姓名、籍贯、性别、年级、紧急联系人、记过、成绩、、、

2024-04-16 16:02:10 578

原创 冯诺依曼结构理解

CPU的计算速度是很快的,所以数据设备间的拷贝效率,决定了计算机整体的基本效率。在降低了计算机成本的基础上,并没有对计算机的运行处理速度造成很大的损失。当一个创新发生,产生了相当范围的影响,那么创新就不仅仅局限于创新本身了。数据是要在计算机的体系结构中进行流动的,在流动过程中对数据加工处理。这样CPU取数据时,就可以不用等输入设备,而是直接从存储器中取数据。那么,也就是说,这个世界使用计算机的只有100人。这样的设计构架,加快了整体计算机的数据处理效率。计算机中寄存器的速度是最快的,既然是最快的。

2024-04-15 07:39:38 319

原创 Linux gdb调试

l XXX.c:0 #对XXX文件从0行开始查看源代码。为什么软件版本要分为release和dbug版本呢?b n :在n行位置打断点(只能一个一个设置)release:成熟版本(不可以被调试)p(print) &n:查看变量n的地址。undiplay n:取消n号常显示。debug:测试版本(可以被调试)display n :常显示变量n。为什么dbug版本可以被调试呢?l n #查看n行(一般在中间)n(next):逐过程(F10)s(step):逐语句(F11)p(print) n:查看变量n。

2024-04-14 20:48:13 308

空空如也

空空如也

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

TA关注的人

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