自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 leetcode2418.按身高排序

通过一个lamda表达式来改变index的排序策略,从而通过index数组的下标记录来队名字有了降序。就是创建一个身高:名字的哈希表,先将每个人名字和身高的对应信息存入哈希表中,然后再将升。高降序排序,最后再将升高对应的哈希表中的名字取出,就返回了对应的按身高降序排序的名字,这种方法才是本道题的最优解,设置一个下标数组,通过对身高的排序对下标数组进行排序,然后。这种方法是最常见的,但并不是最优的。顺序返回对应的名字数组。这就是这道题的两种解法。

2024-04-23 15:17:25 169

原创 lettcode1005.k次取反后最大的数组和

直接返回结果,因为剩余的转换次是偶数次,相当于取一个数进行不停的转换偶数次,最终结果还。对应的转换次数是奇数次,对应必须要有一个数转换成负数,为了是数组和最大,所以需要找到数。直接将前k小的数组中的负数转化成正数,然后返回数组和。组中最小的数将其转换成负数,再将数组的和返回即可。以这种方式修改数组后,返回数组。是这个数本身,所以可以直接返回。可以多次选择同一个下标。这就是这道题的解法。

2024-04-22 17:43:33 331

原创 leetcode122.购买股票的最佳时机||

这道题与购买股票的最佳时机|的不同就是,在每一天都可以决定是否要出售或者购买股票,所以。也就以为这我们只需要在股票上升的阶段结束之前将其买掉就能活的最大利润,通过一个折线图演。其实双指针的方法是更好的,应为它对应的+=次数少,解法也就更优。对应只要获取到折线的上升区间,就是这段股票能获取的最大利润。在每一天,你可以决定是否购买和/或出售股票。其实不断的找上升区间就是贪心算法的体现。你也可以先购买,然后在。

2024-04-22 16:17:21 304

原创 leetcode121.买卖股票的最佳时机(贪心算法)

要想找到买卖股票的最佳时机,就有需要持续关注股票的最低点和最高点,当然因为题目要求,一。通过每天的股票价格和最小值的差值来更新最终结果,再更新最小值,其中的最小值就是贪心算法。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回。定要找到最低点之后再取寻找最大利润,要一直更新最大利润。设计一个算法来计算你所能获取的最大利润。定义两个变量,一个是最终结果,一个是最小值。这就是买卖股票的最佳时机的贪心解法。这就是解决示例一的具体流程。买入这只股票,并选择在。

2024-04-19 17:12:29 269

原创 lettcode334.递增三元子序列

如果满足上述条件,直接将nums[i]赋值给b,比a大比b小,说明将其替代b可以得到更有的解,这。创建两个变量分别是a,b,将a初始化成已给数组的第一个元素,将b初始化成int的最大值,这道相对比较简单,只需要设置连个变量,通过一次遍历和几次比较就可以非出答案,具体的解法。如果满足,直接返回,对应找到了递增的三原子序列,当然在第一次是不可能的,最少遍历两次才。在不满足上述条件的情况下,再次判断nums[i] > a。直接将num[i]赋值给a,这里也是贪心算法的体现。在不满足上述所有条件的情况下,

2024-04-19 16:25:12 197

原创 leetcode376.摆动序列(贪心算法)

我们可以定义两个变量,left和right,其中left用来记录当前点和前一个点的差值,right则用来记录。(2)取中间的有效点,中间的有效点的left和right的正负一定是不相同的,所以也包含了这种情。如果碰到连续并且值相同的点,那么就一定会有right == 0,我们队连续的点事不做处理的,直接。(1)取第一个点,无论如何,第一个点的left一定是0,所以乘积也一定是0,这里包含了这种情。也是利用贪心算法,在一段上升区间取其最大的值,在一段下降区间里取其最小值,画出折线图以。

2024-04-19 15:49:40 403

原创 lettcode179.最大数

(1)ab > ba(这里的ab是将数据b添加到数据a的前面) ——> a在前,b在后。最后,题目要求输出的是字符串,所以有一个优化是可以在开始就将数组中的数字全部转化成字符。串,同时这样也有利于排序的比较,不用将整形数字拆分来比较,直接比较即可。,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。设有两个元素a和b,一定要保证这两个元素是可以比大小的,所以满足全序关系,说明我们规定的排序是正确的。(3)ab < ba——>b在前,a在后。a在前 && b在后 ——>无所谓。

2024-04-18 17:22:37 190

原创 leetcode2208.将数组和减半的最少操作次数(贪心算法)

nums 的和减小了 33 - 14.75 = 18.25 ,减小的部分超过了初始数组和的一半,18.25 >= 33/2 = 16.5。nums 的和减小了 31 - 14.5 = 16.5 ,减小的部分超过了初始数组和的一半, 16.5 >= 31/2 = 15.5。最终数组为 [5, 4.75, 4, 1] ,和为 5 + 4.75 + 4 + 1 = 14.75。注意在减去数组最大值的一半后需要将数组中的最大值删除将最大值的一半放入,从而再次寻找最。这是第一种情况下,贪心解可以与最优解交换。

2024-04-18 15:19:49 308

原创 leetcode:860.柠檬水找零

这是一道经典的找零问题,初识的资金是0,需要通过想顾客买水来获取资金,再通过获取到的资金来向用户找钱,如果到最后一个顾客钱还是可以找开,就返回true,否则返回false。将5元的计数--,将10元的计数--,这里不用设计20元的计数,因为20元是没法找出去的。可以将 10 + 5,和 5 + 5 + 5的位置互换,也可以调整成贪心解。需要判断有没有之前顾客给的5元钱,所以需要用一个变量来记录5元钱的个数。有5元钱:直接找给顾客,将自己的5元计数--,再将自己的10元计数++

2024-04-18 12:28:54 379

原创 网络编程套接字

端口号是用来表示一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理。其实client的port是多少,其实不重要,只要保证主机上的唯一性就可以了。接受主机把从网络上接到的字节依次保存在缓冲区中,也是按内存从低地址到高地址。内存中的地址有大端和小端之分,那么如何定义网络数据流的地址呢?IP地址 + 端口号能够表示网络上的某一台主机的某一个进程。网络协议中的下三层,主要解决的是数据可靠的运送到远端机器。对应的inet_ntoa是将整形的ip地址转换为字符串。

2024-01-31 19:22:38 588

原创 网络的基础

几乎任何层协议,都要在报头中提供,决定将自己的有效载荷交付给上层的哪一个协议的能力(分用)mac:mac地址,出局域网之后,源和目的mac地址都要被丢弃,让路由器重新封装。对于两个用户直接通行,对应网络层的报文段中有对应的源ip地址和目的ip地址,需要通过路由器进行转发,而路由器在转发过程中通过和数据链路成的转换关系,ip:ip地址,尤其是目的ip,一般是不会改变的,协助我们进行路径选择。其中五层协议中最重要的传输层和网络层就是操作系统中的板块。IP实现了全球的软件的虚拟层,一切皆是报文。

2024-01-31 19:13:12 492

原创 进程间通信

一般的操作系统,会有一个独立的通信模块 —— 隶属于文件系统 —— IPC通信模块定制标准 —— 进程通信是有标准的 ——system V && posix。2.共享内存的删除不是直接删除,而是删除进程与物理地址的映射关系,到映射链数为0的时候,才为真正的删除。1.key对应是一个int,至于数字是多少不重要,重要的是它的唯一性,能够让不同的进程执行唯一标识。对应的key都是面向系统内核的,id都是面向用户的。如果两个不同的进程,打开同一个文件的时候,在内核中,操作系统会打开几个文件?

2023-12-05 11:15:13 91

原创 linux信号

可以看到在优化情况下对应捕捉到2号信号后,对应的flag置为1,但是main中的循环还是不结束,很明显while循环中的flag和handler中的flag已经不是同一个flag了,这就出现的二义性的问题了。在linux中,一个终端,一般会有一个bash,每个登录,只允许一个进程是前台进程,可以允许多个进程是后台进程,大部分可执行文件执行起来是后台文件。4.一个进程在信号产生,到信号被处理,就一定会有时间窗口,所以进程还有具有保存信号的能力。所以在是有信号捕获子进程退出的时候,最好用等待的方式来进行退出。

2023-12-05 11:09:04 146

原创 文件基础IO

在学习c++的时候一定看过对应一些代码的反汇编,其实反汇编后面的函数,还是指令对应都已经转化成了地址,而且是虚拟地址,对应方便我们在进程地址空间中找到它,并映射到真正的物理地址,并执行操作。这个接口的命名比较绕,需要更好的理解,对应的含义是让newfd成为oldfd的一份拷贝,最终意味着olded是最终保存在newfd的,所以如果我们要实现上述的操作,用来将比特位的位置和对应的块号映射起来,比特位中的1,0来表示文件内容,块有没有被使用,在删除文件的时候,直接将对应的比特位置0即可。

2023-11-12 15:33:38 119

原创 进程程序替换

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动。linux中形成的可执行程序,是有格式的,ELF,可执行程序的标头,程序入口地址就存放在表头中。如果这些函数调用成功则加载新的程序从启动代码开始执行,不返回,没有返回值。环境变量也是数据,在创建子进程的时候,环境变量已经被子进程继承下去了。可以发现在调用完进程序替换以后,再不会执行main函数后面的代码。

2023-10-29 11:23:45 99

原创 进程地址空间初识

增加进程虚拟地址空间可以让我们在访问内存的时候,增加一个转换的过程,在这个转换过程中,可以对我们的寻址请求进行审查,所以一旦异常立即拦截,该请求不会到达物理内存。cpu中会有一个cr3地址寄存器来寄存页表的地址,这样每次一个进程开始的时候就会找到对应的页表地址,从而做到了进程的独立性、对应的变量先通过进程地址空间产生一个虚拟地址,再将虚拟地址与物理地址通过页表对应,产生物理地址,细节后面会有。地址空间本质是一个数据结构对象,类似pcb一样,地址空间也是要被操作系统管理的:先描述,再组织。

2023-10-19 14:37:51 107 1

原创 c++11

这两种初始化方法看似相同,其实是有区别的,vector的初始化{}里面可以随便添加元素,但p1只能添加两个元素。上图的typeid对应的只能打印出对象的类型,不能直接使用,而的decltype则可以。主要是用{}来初始化一些内置类型和自定义类型,如上图,对应的初始化都是正确的。对应的框柱的那个构造函数就是c++11新加的可以去添加元素的构造函数。对应的都可以初始化,而且调用的都是构造函数。左值引用给右值引用取别名:加const。能取的就是左值,不能取的就是右值。左值引用:给左值取别名。

2023-09-25 14:12:40 85

原创 哈希表的模拟实现

对应的容量不够了还要进行扩容,这里直接将扩为两倍,然后再将旧表的数据插入新表。2.如果要插入的位置已经有元素了,就使用线性探测找到下一个空位置直接插入。2.不管元素重复不重复,都将其头插在对应的位置的链表中即可。其实就是一个指针数组,每一个位置可以像链表一样向下延伸。可以看到各个方面hashset是优于set的。还有寻找和删除的实现,都比较相似。1.闭散列(线性探测)2.开散列(哈希桶)

2023-09-25 14:10:34 237

原创 位图的实现,布隆过滤器

3.位图应用变形:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数。由于位图是通过一个比特位来判断是不是在范围里面的,所以其对应的时间复杂度都是O(1)的。2. 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?要想实现位图,就得知道我们要记录的这个数应该存储到哪个位置,假设这个数是x。x % 32 所得的值就是对应在此字节的第几位上,这样一来位图就简单了。要找到只出现一次的整数,就要让出现一次和出现多次的数有所区别,2.精确的场景,布隆过滤器。

2023-09-21 12:59:27 46

原创 红黑树插入的实现

3.如果对应的grandparent的父亲是红色节点,则需要将cur = grandparent,再次进行循环。这种情况只需要将parent和uncle节点都弄成黑色,对应的grandparent节点弄成黑色。分别进行左旋或者右左双旋,再将parent/cur变为黑,grandparent变为红即可。分别进行左旋或者右左双旋,再将parent/cur变为黑,grandparent变为红即可。再将parent变为黑,grandparent变为红。再将cur变为黑,grandparent变为红。

2023-09-19 14:16:09 75

原创 AVL树的实现

5.更新后平衡因子==2 or -2,说明parent所在的子树高度变化且不平衡,对parent所在的子树进行旋转,使其平衡,平衡之后自然退出循环。3.更新后平衡因子==0,说明parent所在的子树高度不变,不会影响祖先,所以不用沿着root路径继续向上更新了,直接跳出循环并结束。4.更新后平衡因子==1 or -1,说明parent所在的子树高度变化,会影响祖先,所以需要沿着root1路径继续向上更新,循环继续。可以理解为第一次只是预处理,将其变成parent == -2,cur == -1的情况。

2023-09-13 22:52:57 87

原创 leetcode.105 从前序和中序遍历序列构造二叉树

题目要求通过前序遍历和中序遍历来构造二叉树,首先得明白前序遍历,分别是根,左子树,右子。树,中序遍历则是左子树根右子树,如此便有迹可循了,首先通过前序遍历可以确定二叉树的根,假设root为根,从前序遍历的第一个元素,通过root,根据中序遍历,可分为。之后再将前序遍历中的下一个元素作为root,再进行递归遍历左子树和右子树。再通过中序遍历来确定左子树和右子树,再通过递归遍历来构成二叉树。前序遍历:根 左子树 右子树 (用来确定根),请构造二叉树并返回其根节点。

2023-08-27 15:38:06 290

原创 JZ36 二叉搜索树与双向链表

1.要求不能创建任何新的结点,只能调整树中结点指针的指向。将搜索二叉树转换成一个排序的双向链表,从二叉树的性质可以知道其中序遍历对应的是有序的,所以形成的双向链表的顺序必须跟着搜索二叉树的中序遍历走,这样才保证是有序的,其次我们需。要将二叉树的左右指针当做双向链表的前后指针,左为前右为后,从而通过中序遍历来确定双向链。3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构。输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。2.返回链表中的第一个节点的指针。

2023-08-24 14:50:19 68

原创 进程的概念

当进程退出并且父进程没走读取到子进程退出的的返回代码时就是僵尸状态。2.僵尸状态一直不出,pcb就一直要维护。父进程提前退出,子进程就成了孤儿进程。1.长时间不进行删除会导致内存泄漏。会被1号进程(系统进程领养)。HOME:指定用户的主工作目录。PATH:指定命令的搜索路径。SHELL:当前的shell。3.导致内存资源的浪费。

2023-08-23 11:11:45 95

原创 map和set

初始化:需要使用pair进行初始化。用的最多的是最后一种初始化。

2023-08-22 11:47:21 63

原创 stack,queue,deque的使用

3.deque结合了stack和queue还有vector,他们的接口在deque上都有体现,但其实没必要,这么。这就是stl中的queue,deque,stack。其分别为入栈,出栈,取栈顶元素,判断栈是否为空。

2023-08-21 12:51:12 68

原创 list使用

对应的insert的使用需要注意的是其不想string一样可以使用迭代器重载的“+”号,因为list是由指针。指向的所以“+”号重载起来只会影响效率,所以我们要使用insert或者erase的时候需要先找到要插。1.关于push_back,push_front,和对应迭代器的使用。入的地方或者删除的元素才可以顺利插入。这些就是对应的需要掌握的并且基础的。4.关于reverse和sort。要注意的与insert相同。

2023-08-20 18:21:12 586

原创 vector

vector:注意自己实现insert时:外部pos的增加是无法解决的:vec。

2023-07-16 23:12:37 181

原创 string类

rfind:这里是从后向前找,与find的查找方向刚好相反。对应的maxsize不同的编译器与系统,对应的值都不同。在使用迭代器调用函数时,上述这种情况会发现类型不匹配。用find查找一个网站的协议,域名,资源名。上图是vs2013的maxsize。上述就是getline的作用。

2023-07-14 21:35:31 252

原创 linux环境基础

在使用静态库进行静态链接的时候,会将自己的方法拷贝到目标程序中,该程序以后不在依赖静态库。动态库不能缺失,一旦对应的动态库缺失,影响的不止一个程序,可能更多程序都无法正常运行。可重定位的目标文件,不可以独立执行,虽然已经是二进制了,需要经过链接才能执行。如果要按照静态库的链接方式,进行形成可执行程序,需要添加-static选项。在liunx系统中,编译形成可执行程序,默认采用的是动态链接,提供动态库。3.yum安装(最长用到的安装)—解决安装源,安装版本,安装依赖。(n)x:对光标字符之后的进行删除。

2023-07-12 18:24:10 206

原创 string

rfind:这里是从后向前找,与find的查找方向刚好相反。对应的maxsize不同的编译器与系统,对应的值都不同。在使用迭代器调用函数时,上述这种情况会发现类型不匹配。用find查找一个网站的协议,域名,资源名。上图是vs2013的maxsize。编译器会自己进行调用,不用管。

2023-06-04 11:09:13 507

原创 linux常见指令以及权限理解

我们以自己当前所处的路径为起始参照位置,来进行特定文件的定位,这种路径:相对路径。1.绝对路径往往比较长,但是不变,一半在一些固定场景,配置文件中使用。其中的>是输出重定向,这里是输出到test.exe文件中。但是root不讲道理,在任何情况下可以任意操作文件或目录。我们把从开始定位到指定位置,具有唯一的路径叫做绝对路径。这里的目标文件或目录可以在拷贝的时候自动创建。递归拷贝,可以将递归生成的目录直接进行拷贝。3,在linux中,以.开头的,是隐藏文件。存在的意义:帮助用户定位当前目录下的文件。

2023-05-15 11:36:23 664 1

原创 构造函数和析构函数

可以看见错误中有包含多个默认构造函数,上述一个为无参构造函数,一个为全缺省构造函数,都为默认构造函数,所以冲突了。构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证。7.无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只有一个。无参构造函数,全缺省构造函数,那写编译器默认生成的函数,都可以认为是默认构造函数。1.一般情况下,有内置类型成员,就要考虑自己写构造函数,不能用编译器自己生成的。可以看出编译器自己初始化后是随机值,这是一个c++的官方bug。

2023-05-01 22:06:27 477

原创 应用,auto,内联函数

2.谨慎使用引用作为返回值,出了函数作用域,对象不在了,就不能引用返回值,还在的话就可以引用返回值。如果Count函数结束,栈帧被销毁,没有清理栈帧,那么ret的结果侥幸是正确的。内联函数的申明和定义不能分离。如上图:第一个是正确值(只是侥幸的),第二个是随机值。3.引用一旦引用一个实体,再不能引用其他实在体。如果栈帧被清理了,那么ret将会是随机值。1.引用在定义的时候必须初始化。1.基本任何场景都可以引用传参。1.auto不能作为函数的参数。2.一个变量可以有多个引用。这里打印的ret是不确定的。

2023-04-29 17:54:24 856

原创 希尔排序的实现

本质就是在插入排序之前进行几次预排序,让数组中的数相对比较有序,通过插入排序的讲解我们。上图中就用了两次预排序来使其尽量有序,最后再直接插入排序来降低时间复杂度,插入排序的具。先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每。而希尔排序就是把插入排序作为单趟,俩进行分组排序,多一次分组排序(预排序)就在最后一。其实希尔排序就是插入排序的优化,通过多次插入排序来降低其时间复杂度,这就是希尔排序。知道,越有序其时间复杂度越低,那么我们应该如何进行预排序呢?

2023-04-24 12:37:51 231

原创 归并排序的非递归实现

对应上图的例子,如果 gap = 4 的时候,对应的end1,begin2,end2都可能越界,所以我们应该。其实想法和递归实现的类似,只不过是通过其他变量分组,而不是mid,我们可以将数组先分为两。两一组,再合并成四四一组,以此类推,最后一次合并排序后,得到的数组就为有序数组了,所以。界,在这种情况下,就可以全部拷贝,不用分部,在一次内部循环结束后进行一次拷贝, 当然也。在赋值后再进行判断是否越界,如果越界,那就重新赋值,使他们都在数组范围之内,从而不越。时候就是四四分组,以此类推,排位有序。

2023-04-17 12:48:06 113

原创 归并排序的递归实现

上图中的mid是关键,是链接递归的关键,每得到一个数组就先求mid,之后再进行递归,这样就。如图所示,其中红色箭头与图一的红色箭头对应,绿色箭头与图一的绿色箭头对应,相信大家看完。将已有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,再使子序列段间有序。这就是归并排序的基本思想,有没有发现和快排的很相似,但大家千万不要搞混,只需要记住一。先将小的元素放入动态开辟的数组中,然后看有没有余下的元素,直接放入动态开辟数组中。这两幅图后能明白递归的真实情况,这就是递归归并排序。

2023-04-16 13:55:47 106

原创 命名空间,缺省函数,函数重载

缺省参数不能在函数声明和定义中出现(声明给缺省参数,定义不给)局部域,全局域,展开命名空间域或者指定访问命名空间域。2.命名空间(为了解决c语言的命名冲突问题)解决方法:namespace关键字。1.引用在定义是必须初始化。2.一个变量可以有多个引用。

2023-04-16 10:19:49 50

原创 计数排序的实现

元素,将其存到a数组中,切记要将count中的元素还原回来(+min),让后再存入a数组中。这就达到了统计相同元素出现的个数的效果,一定要先求最大元素和最小元素,不让动态开辟的空。重复元素的数组排列,会非常快,相较于之前提到的其他排序,这个排序比较特殊,他是一个非比。从代码中可以看出,除了找最大和最小元素的时候存在比较(这不在计数排序的范畴里,为了节省。每个元素的大小减去最小值,作为开辟的新数组的下标,下标对应的元素++要想事统计的元素尽量的少,就应该把整个数组的。同元素出现的个数的目的。

2023-04-14 17:09:42 336

原创 快排的非递归实现

4.将两组新的左边界和右边界进行入栈,先入右边界,后入左边界。4.将两组新的左边界和右边界进行入栈,先入右边界,后入左边界。,并删除一次,由于栈是先进的后出,所以先出来的应该是左界,排好序的那个元素的下标),同过返回的下标将数组分为两部分,1.先将第一次要排序的右边界和左边界先后入栈。1.先将第一次要排序的右边界和左边界先后入栈。第一次要排序的右边界和左边界先后入栈。再进行一次取出栈顶元素,并删除一次。再分别让这两部分的左边界和右。,从而得到右边界,让后执。入栈元素:8,9,4,3。

2023-04-12 17:13:26 380

空空如也

空空如也

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

TA关注的人

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