自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 专题一:汉诺塔问题:递归算法的精妙解析

请先看我的回溯算法的第一篇文章以leetcode汉诺塔问题讲解。

2025-05-11 13:45:10 145

原创 回溯算法:深度优先搜索的终极指南

关于二叉树的遍历:这里讲解后序遍历,左右根,当我们遍历一个结点时,先考虑左子树,右子树,根,遍历左子树时,又把左子树看成根节点,在左右根,依次递归下去。我们在研究主问题时,发现子问题也是相同的,如果设解决主问题需要用到函数f,解决相同的子问题也会用到f,因为他们是相同的问题,此时就会出现。以走迷宫为例:每走到一个拐点,都可以分左右,那我第一个往左走,发现行不通,就回到上一级的这个操作就称之为回溯,然后在由上一级往另一边走。在归并那里,就是一个数组,然后标记一下数组的左边和右边,完成数组的排序。

2025-05-11 11:56:46 715

原创 动态规划之二维费用的背包问题解析

给一个m和一个n,m表示最多有多少个0,n表示最多有多少个1,选出来的子集,记录0和1的个数,在不超过的情况下能选的最大子集,也就是能选多少个元素从这里,如果观察敏锐的话,可以发现这是一个背包问题,就是选一堆东西,不能超过巴拉巴拉但这里是有两个背包,也就是m和n,所以这就叫二维背包问题就是由原来的一个体积限制,到现在的体积和重量限制m和n就是两个限制。

2025-05-10 19:39:14 246

原创 动态规划之完全背包问题

牛客网例题为例,由于 leetcode没有经典例题可以讲解,牛客网这道可以当作模板题。

2025-05-10 16:19:35 227

原创 动态规划之背包问题(分割等和子集问题)

给一个正整数的数组,让你分隔成两个相等的数组通过观察,我们可以发现,总和是一定的,也就是sum,把sum分成两部分,每部分都是sun/2转换为01背包问题,每个元素都是0或1,挑出的元素总和是sun/2,剩下的那部分就是sum/2了。

2025-05-10 11:57:20 223

原创 动态规划之背包问题:组合优化中的经典NP挑战

背包问题是一种经典的组合优化的NP问题,在计算机科学、运筹学等领域有着广泛的应用。问题可以简单的描述为:假设有一个容量为C的背包和n个物品,每个物品i都有重量w[i]和价值v[i]。目标是选择一些物品放入背包,使得放入背包的物品总价值最大,同时背包中物品的总重量不能超过背包的容量。这里先简单介绍两种背包问题:1.01背包:也就是你物品的个数是1个,你拿了就剩0个,没拿就剩1个2.完全背包:物品个数无数个,可以拿0/1/2/3/4至无穷多个背包也可以分两种:1.背包不需要装满。2.背包必须装满。

2025-05-09 22:20:52 1685

原创 动态规划之两个数组的dp问题(最长公共子序列)

1.子序列2.公共子序列的最长长度。

2025-05-08 16:39:02 398

原创 动态规划之回文串问题

为什么我们要学习动态规划处理回文子串原因在于我们能够将所有的子串是否是回文的信息储存在dp表里面。

2025-05-07 15:19:20 370

原创 STL之stack&&queue

1.栈是没有迭代器的,因为栈的特性是先进后出,不能随便访问,所以不支持迭代器2.如何遍历?先判断为不为空,不为就取栈顶的数据,取完之后pop就行3.为什么没有析构函数?因为它底层是别的容器,当stack出了作用域自动销毁时会调底层容器的析构函数1.队列是一种容器适配器,专门用于在FIFO(先进先出)中操作,其中从容器的一段插入元素,另一端提取元素2.队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素,元素从队尾入队列,从对头出队列。

2025-05-06 21:30:36 1125

原创 动态规划之子序列问题1

以leetcode300题为例此题最为经典,所有的算法书在讲子序列问题时都以这个为模板题,后面的题可以按照此题的分析方法进行分析。

2025-05-05 17:40:58 377

原创 动态规划之最大子数组(环形数组)

第二种就是你可能前面一部分和后面一部分成环了,你求的是最大,那里面就剩最小。无非就两种情况,一个是你在普通数组的情况下能求最大值,也就是你没有成环。环形数组也就是在普通数组上的变形。

2025-05-04 16:05:43 90

原创 动态规划之子数组系列

2025-05-04 15:39:28 80

原创 动态规划之多状态问题(股票买卖利润最大)

股票买入后不能在买,也就是必须买入后卖出才能买一次交易叫买卖,这样的交易次数不能超过两次返回最大利润。

2025-05-04 12:31:59 580

原创 动态规划之多状态问题1

也就是给一个预约数组,选择一些数字,让其总和最大,但不能选择相邻的两个数字。

2025-05-03 18:49:18 281

原创 动态规划之路劲问题3

dp[i][j]:表示到达这个位置时的最少的健康点数,如果我们以这个表示我们的状态,就会发现有问题,因为这个ij位置的健康点数不仅仅受下一步(也就是往右和往下)的影响,还受后面很多个路径上的点的影响,比如以例题为例:一开始我们如果初始值为3,走完-2还剩1,那我们走不出-3和-5,如果我们初始值为6,走完-2,-3,3,1,但是到-5时变为0,所以初始值为7才是对的,所以我们ij位置不仅仅是受最近的i j-1和i-1 j位置影响,还受多个位置的值影响。以dp[i][j]为结尾,最少的健康点数。

2025-05-03 17:56:01 418

原创 动态规划之路径2

2025-05-03 16:06:21 165

原创 STL之list容器

1.list的底层是双向链表结构,双向链表中的每个元素在互不相关的独立结点中,在结点中通过指针指向前一个元素和后一个元素2.list是可以在常数范围内在任意位置的插入和删除的序列式容器,并且该容器可以前后双向迭代3.vector的优点:支持随机访问,间接的就支持了排序/二分查找/堆排序等缺点:1.头部和中部的插入效率低,需要挪动数据2.插入数据空间不够需要增容,增容需要开新空间,拷贝数据,释放旧空间list的优点:没有增容代价,且任意位置插入都是0(1);

2025-05-03 12:25:01 1447

原创 动态规划之路径问题1

leetcode62:不同路径。

2025-05-02 14:23:07 313

原创 STL之vector容器

1.vector是可变大小数组的容器2.像数组一样,采用连续的空间存储,也就意味着可以通过下标去访问,但它的大小可以动态改变3.每次的插入都要开空间吗?开空间就要意味着先开临时空间,然后在拷贝旧的到新的上面,在释放原来的,就时间而言,这是一个相对代价很高的任务;显然这是不行的,vector的分配策略:会分配一些而外的空间以适应可能的增长,例如我们平时说的以1.5或者2倍的方式增容,不同的库选择不同的策略权衡空间的使用和重新分配,以至于在插入一个元素时能在常数时间内插入;

2025-05-02 13:41:05 1285

原创 动态规划简单题2

leetcode91题(解码方法)

2025-05-01 21:55:16 384

原创 动态规划简单题

以leetcode746(使用最小花费楼梯)进一步巩固动态规划答题步骤。

2025-05-01 18:56:21 396

原创 动态规划引入

动态规划的题目大致解决方法都可以按照如上的思路进行。

2025-05-01 17:29:19 536

原创 STL之string容器

c_str():返回c格式的字符串 (在string类中是以size表示有效大小,c风格是以\0表示结束,返回c格式的字符串是在末尾加\0,而string在处理字符串是没有\0结尾表示结束,而是用size)在c语言中,字符串以"\0"结尾的一些字符的集合,并且提供了一系列的str函数,但有时候可能会越界访问,且库函数是与字符串分离的,不太符合OOP的思想,为了方便管理,c++封装了一个类。size():返回字符串的有效长度(一般用这个,length比较早期,size是与其他容器统一)

2025-05-01 12:55:50 1024

原创 Linux基础IO

概念:IO就是内存和外设之间的数据传输过程。

2025-04-28 20:26:19 926

原创 Linux进程控制

fork()函数初识:作用:在当前进程创建一个子进程,新进程称为子进程,原进程称为父进程返回值:pid_t实际是一个int类型,typedef过,子进程返回0,父进程返回子进程id,出错返回-11.分配新的内存块和数据结构(PCB,页表,进程地址空间)给子进程2.将父进程的部分数据结构内容拷贝给子进程(继承)3.添加子进程到系统进程列表当中4.fork()返回,开始调度器调用,调度器可能会选择父进程继续执行,也可能会选择子进程执行,这取决于调度算法和系统的当前负载情况。注意:在现代操作系统中,

2025-04-26 14:54:07 1142

原创 Linux进程概念

管理:先描述后组织如何描述:简单来说就是用结构体struct如何组织:简单来说就是用所学到的高效的数据结构,链表等等概念:进程是指在系统中正在运行的一个程序实例,是操作系统进行资源分配和调度的基本单位。当一个程序被加载到内存中并开始执行时,它就成为了一个进程。

2025-04-24 16:53:54 833

原创 c++之类与对象(third)

构造函数赋值:在创建对象时,编译器会自动调用构造函数进行赋值,之前简单来说叫初始化,但这里不能叫做初始化,因为初始化只能初始化一次,在构造函数体内可以重复赋值,所以出现了初始化列表。初始化列表:以一个:(冒号)开始,接着是以,(逗号)分隔的数据成员列表,每个”成员变量“后面跟一个放在括号中的初始值或表达式注意:1.每个成员变量在初始化列表中只能出现一次(对应初始化只能初始化一次)2.类中包含以下成员,必须放在初始化列表位置进行初始化:引用成员变量const成员变量。

2025-02-18 20:57:27 386

原创 c++之类与对象(second)

这样写就会有问题,问题在于test函数的参数是const Date&d,d所指向的内容是不可以修改的,但是在d里面调用了Printf,参数是隐含的this指针,Date const*this,这个是可以修改this所指向的内容,这说明权限放大了,要加const去修饰this指针,也就是void Print()const。在某些情况下,如果你不想直接暴露对象的真实地址,可以返回NULL,或者获取对象地址需要进行额外的控制和处理,通过&操作符重载,可以实现自定义的逻辑,而不是简单的返回对象的真实地址。

2025-02-18 14:57:19 1521

原创 c++之类和对象(first)

/类体:由成员变量和成员函数组成//注意有分号,类似于一条语句class为关键字,classname为类的名字,{}为类的主体,定义完后有分号;类中的元素叫做成员,类中的数据称为成员变量或者类的属性,函数称为成员函数或者类的方法1.声明和定义都在类体内注意:如果成员函数在类中定义,可能会被当初内联函数处理2.声明放在.h文件中,定义放在.cpp文件中(这种更推荐,更符合工程的思想)但定义时要声明是在哪个类中的。

2025-02-17 21:53:15 1843

原创 c++之范围for

对于以前要遍历一个数组,需要程序员自己书写数组的范围(sizeof)因此c++中引入范围for,避免因为范围书写错误而导致程序有意想不到的结果。

2025-02-17 14:45:01 338

原创 C++之auto

也就是说auto相当于一个类型声明时占位符,编译器会在编译期间将auto替换为变量的实际类型。在早期的c语言和c++auto仅仅是一个自动存储器的局部变量,也就是生命周期出了代码块就没了。实际编译器只对第一个类型推导,然后在用推导出来的类型定义其他变量,所以c和d那条编译不过。但c++11中auto是一个全新的含义:自动推导类型,编译器会在编译时期推导。这样是编译不过去的,必须要auto b=a;auto不能作为形参类型,编译器无法对a的实际类型推导。两个一样,没有区别,b和c的类型都是int*

2025-02-17 14:28:13 247

原创 c++之内联函数

内联函数可以提高效率,但代码很长或者有循环/递归都不适用,只适合短的代码,比如交换两个值的函数?并且加了inline是否会在相应的位置展开?取决于编译器?inline只是给编译器一个建议并不是一定会展开。内联函数不建议定义和声明分离,分离会导致链接错误,因为inline被展开之后就没有函数地址了,这样就链接时就无法找到函数。

2025-02-17 12:13:27 206

原创 c++之引用

引用可以提高传参时的效率,避免创建临时空间,效率高。但实际使用场景得谨慎引用的底层逻辑是使用指针实现。

2025-02-16 21:40:19 1603 1

原创 c++之函数重载

3为函数名的字母个数,ii为两个类型int int,那么在连接时就可以辨认出是哪个函数,例如add(int,int)就会找到<_Z3addii>,如果是add(char,char)就会找到<_Z3addcc>,windows也是同样的道理,只是命名风格不一样,那么通过这样看,如果是返回类型不一样是不能构成函数名重载的,只要参数不同就可以构成函数名重载,参数的个数,类型或者顺序不同。是一个固定的前缀,它是修饰后的名字起始标识,用于告知链接器这是一个经过 C++ 名字修饰的符号,编译器和链接器看到。

2025-02-12 20:40:42 514

原创 c++之缺省参数

注意:1.半缺省值参数必须从右向左依次并且连续给出,不能间隔给,也就是可以给cb,不能c a。2.缺省参数不能在函数的声明和定义中同时出现(一不一样都不能同时出现)在声明或者定义时给参数一个默认值,如果调用参数时没有实参,则用缺省值(默认值);注意:传参如果像下面这样就会报错,不允许前面的不传,后面又传。1.全缺省参数:顾名思义就是全部参数都有缺省值。当传参只传一个时,a就用实参,bc用缺省值。顾名思义就是给一半(没有给全)的缺省值。当都不传参时,就都用缺省值。当传全部时,都用实参。

2025-02-12 19:04:03 186

原创 c++入门之命名空间

命名空间:在c/c++中,有很多的变量名,函数或者类的名称存在于全局作用域中,为了避免冲突和更好的管理命名,使用命名空间能够对这些标识符本地化(也就是只有在这个命名空间的域下才可以使用)以避免命名冲突和名字污染。一个命名空间就相当于定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。在c++中使用cout输出,cin输入,并且使用<<(可以自动推导类型不用%d等)所以一般大型项目为了避免命名冲突会std::cout<<a<<endl;2.使用using把命名空间里的某部分内容展开。

2025-02-11 21:54:01 451

空空如也

空空如也

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

TA关注的人

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