- 博客(194)
- 资源 (1)
- 收藏
- 关注
原创 【二分查找】寻找峰值
的变化题,虽说看起来这道题有了多个山峰,好像难了很多,但是题目要求说的是返回任意一个峰值即可,这样子意思就是我们不需要关心当前是在那个山峰走,那么我们依然是可以套用求左右边界的模板的,这里以求右边界为例! 很明显看到,虽然这道题有了多个山峰,但是我们其实在二分的时候,已经可以确切的定位到其中的一个山峰了!这道题了吗,对不对!,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回。 剩下的细节可以参考之前的笔记,这里就不再赘述了! 峰值元素是指其值严格大于左右相邻值的元素。
2025-04-03 09:25:05
274
原创 【C++11】右值引用 && 移动语义 && 完美转发
左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址或者可以对它赋值,左值可以出现在 =的左边,右值不能出现在 =表达式左边。定义时 const修饰符后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。 简单的说,能取地址的就是左值!(虽然 C++11将 const修饰的变量认为虽然不能修改值,但是它还是能修改地址的,所以将常量视为左值int main()// 以下的p、b、c、*p都是左值int b = 1;
2025-04-03 09:21:31
534
原创 【二分查找】山脉数组的峰顶索引
符合下列属性的数组arr称为给你由整数组成的山脉数组arr,返回满足的下标i。你必须设计并实现时间复杂度为O(log(n))的解决方案。arr。
2025-03-20 13:07:50
428
原创 【Linux进程通信】四、System V IPC
这里我们介绍的这种通信方式也就是 system V IPC在我们后面的使用和日常见到的其实并不多,但是包括其中的共享内存、消息队列、信号量,我们如果了解共享内存其原理的话,能够更好的帮助我们了解之前我们学过的进程地址空间的概念! 至于信号量,我们后面讲多线程的时候会再次讲,我们只引入一些概念如互斥等等,而消息队列我们就只说说其原理,不会细讲!
2025-03-20 13:05:39
1081
原创 【二分查找】搜索插入位置 && x的平方根
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为O(log n)的算法。
2025-03-19 13:18:30
568
原创 【C++11】一些易用性的改进
用户定义字面量,也被称为【自定义后缀】,其主要作用就是为了简化代码的读写!返回值类型 operator"" 自定义后缀名称(参数列表)函数体// 用户自定义字面值, 或者叫“自定义后缀”更直观些, 主要作用是简化代码的读写。// 自定义变量,名字要求operator"" xxxreturn x;// 运行结果0.00111000 这种新语法其实很容易理解:#include。
2025-03-19 13:16:47
890
原创 【二分查找】模板题:在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值target,返回[-1, -1]。 你必须设计并实现时间复杂度为O(log n)的算法解决此问题。输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]
2025-03-18 14:02:39
1051
原创 【数据结构与算法】图的最短路径算法实现:Dijkstra && Bellman-Ford && Floyd-Warshall
最短路径问题:从在带权有向图 G中的某一顶点出发,找出一条通往另一顶点的最短路径,最短也就是沿路径各边的权值总和达到最小。 Dijkstra算法是用来解决单源最短路径的算法,即在一个图中找出一个点N,找出以该点为起点到其他所有点的最短路径。但是如果想找到两个顶点A和C之间的最短路径时,Dijkstra算法可能同时找到到达其它顶点(例如顶点B)的最短路径,这一点将在算法演示的时候详细解释。同时 Dijkstra算法无法适用于含有负权重的图。O(V^2)
2025-03-18 13:58:08
1205
原创 【二分查找】二分查找详解 && 二分模板
算法思路很简单,因为在数学概率领域已经得出了结论:一段区间内(不一定是有序,如果符合二分规律的话也是可以的),在保证正确性的前提下进行二分,此时寻找到目标元素的次数普遍最少,也就是说比起三等分、四等分等划分方式,二分是一种最优秀的解法!,也就是说当前这个表达式有可能会出现在不同的位置,但是对于这道题是没问题的,因为此时如果是 left + 1。非常的大,累加完就是一个很大的数,有可能就超出范围了!加上一个不大的数来得到的,并不会造成说溢出的情况!,其实就是它们的差值被平分了,那么 left。
2025-03-17 13:24:47
1191
原创 【Linux进程通信】三、命名管道
其实就是因为操作系统知道这是一个管道文件,知道这个文件是管道类型,所以对于管道文件和普通文件的处理方式不一样,对于普通文件来说它加载到内存中,我们不断的向普通文件里面写入数据,它是会不断的刷新到磁盘上的(与刷新策略有关),所以如果这里是普通文件的话那么我们会看到大小一直在变;语言编写的头文件,通常用来定义数据类型,声明变量、函数、结构和类),所以在程序中要实现的话,我们就得用在程序中创建管道文件的语言级别接口 mkfifo。指令一次,就不断的循环将写入管道的数据一个一个的读到屏幕上面,
2025-03-17 13:22:47
745
原创 【优先级队列】前K个高频单词 && 数据流的中位数
上图摆的很像一个沙漏的形状,其实最重要的就是两个堆的堆顶元素,对于大堆来说,它要存放的是比中位数小的那一半的值,然后堆顶作为边界,存放的就是这些数中的最大值;的时候,其实就只插入了一个元素,那我们可以考虑使用插入排序,因为我们可以让原数组保持有序的情况,只需要处理一个新元素的排序即可,而不需要像解法一中每次调用 addNum()和两个堆顶元素的大小关系,我们这里优先判断的是大堆(优先小堆也是可以的,请自行尝试),因为大堆中存放的是较小的那些元素,所以如果 num。如果不同的单词有相同出现频率,
2025-03-15 15:11:38
862
原创 【数据结构与算法】最小生成树算法实现:Prim && Kruskal
连通图中的每一棵生成树,都是原图的一个极大无环子图,即:从其中删去任何一条边,生成树就不再连通;中取出权值最小的一条边 ( 若有多条任取其一 ) ,若该边的两个顶点来自不同的连通分量,则将此边加入到 G。算法也是常用的最小生成树算法。 两种算法其实在效率是差不多的,只不过实现的方式是不一样的,具体问题具体分析!来判断,每次将选择的边对应的邻接顶点加入到并查集中,然后每次新增边的时候。 具体实现的时候,由于考虑到每次都要选最小的一条边,那这里就用。,不断地加入新的不构成环路的最短边来构成最小生成树。
2025-03-15 15:09:43
1084
原创 【优先级队列】最后一块石头的重量 && 数据流中的第 K 大元素
1046. 最后一块石头的重量有一堆石头,每块石头的重量都是正整数。每一回合,从中选出两块最重的石头,然后将它们一起粉碎。假设石头的重量分别为x和y,且x <= y。如果x == y,那么两块石头都会被完全粉碎;如果x!= y,那么重量为x的石头将会完全粉碎,而重量为y的石头新重量为y-x。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回0。输入:[2,7,4,1,8,1]输出:1解释:先选出 7 和 8,得到 1,所以数组转换为 [2,4,1,1,1],
2025-03-14 13:20:42
1007
原创 【Linux进程通信】二、匿名管道
当没有数据可读时read调用阻塞,即进程暂停执行,一直等到有数据来到为止read调用返回-1errno值为EAGAIN当管道满的时候write调用阻塞,直到有进程读走数据:调用返回-1errno值为EAGAIN如果所有管道写入端对应的文件描述符被关闭,则读取端read返回0如果所有管道读取端对应的文件描述符被关闭,则 write操作会产生信号 SIGPIPE,进而终止写入端write当要写入的数据量不大于 PIPE_BUF时,linux将保证写入的原子性。
2025-03-14 13:17:44
656
原创 【拓扑排序】火星词典
并且我们最后要得到的是每个字母之间的顺序,其实就相当于是一个有向图的指向,所以我们可以根据字符串之间的大小关系,推出每个字母之间的关系,函数去根据题目要求进行建图以及入度的计算即可,这里使用的是双指针的思想,但是我们只需要用一个变量 cur。中每个字符串中出现的字母都是随机的,所以我们只需要关心字符串与字符串之间的关系即可!来表示字符串当前的位置即可,因为我们要比对的是字符串中每个对应位置的字母!中每个字符串也是按照火星词典的字母顺序排序的,但是并没有,words。,让字母之间有次序的指向!
2025-03-13 17:54:47
1122
原创 【C++11】auto && decltype && nullptr
是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以 auto。但有时候可能需要根据表达式运行完成之后结果的类型进行推导,因为编译期间,代码不会运行,此时 auto。既能指针常量,又能表示整形常量。所以出于清晰和安全的角度考虑,将变量的类型声明为表达式指定的类型。,这样就可能回带来一些问题,因为 0。 💡 关键字 decltype。可以让你声明一个变量, 而。中新增了 nullptr。实际上有点像 auto。 所以 C++11。
2025-03-13 17:50:30
605
原创 【拓扑排序】课程表 && 课程表Ⅱ
最后其实我们在判断图中是否有环的时候,不只是像下面代码中通过删除哈希表中的节点来判断最后是否还存在节点来判断是否有环,也可以不用删除哈希表中的节点,只需要最后去遍历一下判断是否所有节点的入度都减为 0。 这道题其实就是要判断这些课程所构成的一个有向图,是否存在环,所以我们可以使用拓扑排序来解决这个问题!然后计算一下每个节点的入度,这是可以在建图的时候计算的!的节点加入到队列中,开始拓扑排序,而拓扑排序的核心实现无非就是使用 BFS。来记录一下拓扑排序的次序而已,其它的都是一样的!
2025-03-12 13:22:44
464
原创 【Linux进程通信】一、进程间通信的概念
之前我们学习了进程以及基础IO的相关知识,所以进程之间我们知道都是具有独立性的(通过写时拷贝和虚拟地址空间),那么如果我们今天想让不同的进程之间进行资源的交互,也就是说进程A想看到进程B发过来的信息并及时接收它,那么我们仔细想想这不就是和进程的独立性相违背了吗 ❓❓❓ 因为我们之前说,如果打开一个文件,并且父进程创建了子进程,那么子进程其实就会拷贝父进程的大部分属性和内容,包括文件描述符表等,也就是说如果父进程指向了一个打开的文件,那么子进程也是会指向那个打开的文件。
2025-03-12 13:21:00
717
原创 【拓扑排序】有向无环图、定点活动图、拓扑排序简介
DAG 图是相较于有向树的更特殊的图。它的作用挺重要的,比如:检查一个图是否有环,可以通过遍历+标记的方式进行检查,若某个顶点的弧指向了另一个已经遍历过的顶点,则该图必定含有环。
2025-03-11 12:21:17
337
原创 【多源BFS问题】地图中的最高点 && 地图分析
这道题的变形,虽然题目中说曼哈顿距离,需要有两个距离最远的坐标,但其实我们并不需要知道其坐标,只需要知道它的距离即可,为什么呢❓❓❓。 请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最大的,并返回该距离。的最远距离即可,这就是最后要求的曼哈顿距离,而不需要说用两个下标去做计算了!,其它都是一致的,这里不再赘述,具体可以参考那道题的笔记!是一模一样的,我们只需要用一个 distance。找到一种安排高度的方案,使得矩阵中的最高高度值。 其实曼哈顿距离的公式就暗示我们了,
2025-03-10 21:25:09
902
原创 【Linux系统IO】六、动静态库
我们之前学 gcc的时候也有接触过一点动静态库的知识,现在要把它单独拿出来讲,主要是因为我们后面肯定在自己开发的时候需要包装自己的库,此时就需要有动静态库的原理知识和使用知识!一般库名称都是中间部分,也就是去掉前缀和后缀的部分剩下的内容,如:libc.so,去掉前缀 lib,去掉后缀 .so-> c动态库。问题来了:为什么需要库呢❓❓❓ 我们给使用者提供我们写的函数的时候,一般是不会将源代码发给他们的,所以都会将 .c文件或者其它文件编译成可重定位目标二进制文件也就是 .o。
2025-03-10 21:21:50
904
原创 【多源BFS问题】飞地的数量
是基本一样的,只不过要求的是被包围岛屿一共有的土地数量!所以这里的正难则反的思想是不难想到的,因为我们有经验了,如果还想不起来的话可以去参考一下。,将它们标记成后面我们不需要统计的部分,而边界岛屿其实就是边界上多个元素为 1。的节点向内拓展的,并且边权为一,所以我们可以采用多源 BFS。 并且我们这道题更好做,因为我们采用的不是 dfs。在任意次数的移动中离开网格边界的陆地单元格的数量。 具体步骤再参考代码,并不难,实际上多源 BFS。即可,而那些被包围的区域,它们的值是 1。表示一个海洋单元格、
2025-03-07 13:51:51
743
原创 【Linux系统IO】五、软硬链接
比如桌面看到的软件保存的是其它的路径,在系统中可能你要运行的可执行程序在一个很深的目录下,就可以在较上层的目录中建立软链接来直接使用。 可以发现硬链接依然能够看到文件的内容,但是软链接已经失效了,因为软链接中存放的是原来源文件的路径,现在源文件没了,当然就找不到了,也可以侧面说明。的概念,也就是说,创建一个硬链接其实就是多了一个指向源文件的一个引用,对于目录来说,只会多添加了一个 inode。,通过保存的路径访问源文件,因此源文件被删除则无法再访问,通过路径将找不到源文件,这时候软链接就会失效。
2025-03-07 13:49:25
1006
原创 【多源BFS问题】01 矩阵
然后以此类推直到队列中没有节点为止,如下图所示:(红色表示当前队列中的节点,蓝色表示新一层更新的距离) 然后这是我们遇到的第一道多源最短路问题,会讲的详细一点!的时候,对于这个 “超级源点” 来说,只知道它本身距离 0。 有了大概的思路,其实代码也不难写,和单源路径其实差不多。 但是有一个问题,如果我们按照题目的要求,以值为 1。的元素作为源点的话,会有一个问题,就是当所有的 1。,请输出一个大小相同的矩阵,其中每一个格子是。为源点向外一层一层的拓展,也就是将 0。
2025-03-06 13:24:21
1642
原创 【C++】可变参数模板
ShowList函数中的逗号表达式:(PrintArg(args),0),也是按照这个执行顺序,先执行 PrintArg(args),再得到逗号表达式的结果 0。同时还用到了。
2025-03-06 13:17:42
957
原创 【BFS最短路问题】为高尔夫比赛砍树
比如上图中的例子,按照高度排序(0不算,它是不能到达的)就是 5、7、9、10、11、13、14、16、17、19、21、26,然后先从高度为 5的树的坐标开始,调用 bfs函数求出其到达高度为 7的树所需要的步数;求完之后再从高度为 7的树的坐标开始,调用 bfs函数求出其到达高度为 9的树所需要的步数,后面以此类推…… 相当于我们把一个大问题,也就是砍掉所有的树,分解为一个一个小问题,也就是一棵一棵树的砍,这样子一来。
2025-03-05 13:43:12
974
原创 【Linux系统IO】四、文件系统
之前我们学习的都是进程与被打开文件的关系,但是那些没有被打开的文件呢,它们需不需要被管理呢 ❓❓❓ 答案肯定是需要的,对于一台计算机来说,磁盘上大部分的文件是未被打开的,而这些文件也需要被静态管理起来,方便我们随时打开!操作系统对未打开文件与打开文件的管理,称为文件系统。接下来我们就来学习未打开文件的管理! 我们大部分人日常中都没见到过磁盘的真实面目,所以如果要想了解文件系统,我们势必要先了解磁盘的简单物理结构,方便我们理解操作系统层面!
2025-03-05 13:40:43
895
原创 【BFS最短路问题】单词接龙
是类似的,只不过细节上有些不同罢了,因为思想是类似的,所以为什么可以转化为边权为一的最短路问题,这里就不再赘述了,具体可以参考上一道题的笔记! 我们主要来讲一下这道题的不同之处:这道题没有明确指出转化字符有哪些,而上一道是直接给出一个转化字符序列的。 这就导致了会出现这种时间复杂度比较高的思路,也是我一开始想到的思路:遍历 wordList。中所有字符串的循环中,此时相当于就一个节点判断的时间复杂度来说,就达到了 O(n^2)如果不存在这样的转换序列,返回。,这样子效率是非常高的。
2025-03-04 13:23:19
633
原创 【C++】模板的改进
在 的泛型编程中,模板实例化有一个很繁琐的地方,就是连续两个右尖括号 会被编译解释成右移操作符,而不是模板参数表的形式,需要一个空格进行分割,以避免发生编译时的错误。 在实例化模板时会出现连续两个右尖括号,同样 、 、 、 表达式转换时也会遇到相同的情况。 标准是让程序员在 之间填上一个空格,而在 中,这种限制被取消了! 在 标准中,要求编译器对模板的右尖括号做单独处理,使编译器能够正确判断出 是一个右移操作符还是模板参数表的结束标记。 模板别名其实就是就是利用模板和起别名两个特性
2025-03-04 13:21:24
1170
原创 【BFS最短路问题】最小基因变化
这道题其实刷题量少的话是比较难解决的,因为其实这道题是关于图论知识的边权为一的最短路径问题,之所以可以转化为这种思路,我们得先理解题意,题目说的是 start。记录了所有有效的基因变化,只有基因库中的基因才是有效的基因序列。一次基因变化就意味着这个基因序列中的一个字符发生了变化。 基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是。中的字符串,然后将其作为一个新的起点继续进行变化直到结果为 end。是类似的,只不过这道题的细节要多一些!变化一个字符后的结果,它是一个 bank。
2025-03-03 14:04:54
833
原创 【Linux系统IO】三、缓冲区
先来看看下面的代码: 目前打印结果和重定向到文件中都是按我们的预期执行的,接下来我们在代码的最后 一下,看看发生什么: 嘶,是不是很奇怪,为什么 之后,向文件里面输出之后居然多了一倍的数据,我们 明明是在输出完之后执行的啊,并且就算是都打印了两倍,那为什么 只被输出了一次 ❓❓❓ 其实这一切都和 以及 有关系,下面我们就来正式介绍一下缓冲区! 首先我们要知道,缓冲区的本质就是一段用作缓冲的内存,下面我们举个例子来解释一下为什么要有缓冲区! 我们在生活中总是需要去买东西或者寄东西
2025-03-03 14:02:50
1071
原创 【BFS最短路问题】迷宫中离入口最近的出口
记录下路径长度,从起点做一个广度优先遍历,将其临近的并且符合要求的节点添加到队列中,此时判断一下如果这些节点中如果就是边界节点的话,则直接返回 step。你不能进入墙所在的格子,你也不能离开迷宫。 如果最后都没找到边界节点的话,说明没有出口,则直接返回 -1。,因为我们要控制一层一层往外走,就得控制每次操作的是一层的节点,算法不同的是,我们要将每一层队列中的节点拎出来做 bfs。 其实这类最短路径问题,和前面的 floodfill。,如果不存在这样的路径,请你返回。,而不是不停的做 bfs。
2025-03-02 14:46:25
516
原创 【C++】智能指针 && 守卫锁
内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。// 1. 内存申请了忘记释放// 2. 异常安全问题Func();// 这里Func函数抛异常导致delete[] p3未执行,p3没被释放。
2025-03-02 14:43:19
911
原创 【广度优先遍历】岛屿的最大面积 && 被围绕的区域
来记录岛屿的最大面积,然后求每个岛屿的面积进行更新最大值即可,而岛屿面积是通过 bfs。函数的解法我们在前面几道题已经基本掌握了,就是使用队列进行操作!这道题的思路,对于这道题来说就是异曲同工之妙,我们只需要用一个变量 ret。 这道题具体思路可以参考递归专题中的笔记,这里不再赘述~!也是很多代码是很相似的,但是不要去背模板,理解至上!(代表土地) 构成的组合,这里的「相邻」要求两个。符合要求的节点入队列时候进行计算的!围绕的区域,并将这些区域里所有的。 岛屿的面积是岛上值为。
2025-03-01 14:15:06
439
原创 【Linux系统IO】二、文件描述符与重定向
简单地说,文件描述符fd的本质就是数组的下标若一个文件被打开,那么肯定会有一个相对应的文件描述符字段给到该文件,用于标识该文件! 既然是数组的下标,那么是什么数组呢 ❓❓❓ 其实在 linux底层中是这样子的,每个进程的进程管理块 task_struct中包含着一个 struct files_struct* files指针指向 files_struct这个结构体,这个结构体也称为 文件描述符表,其中这个结构体中包含着一个指针数组 struct file* fd_array[]
2025-03-01 14:12:48
920
原创 【广度优先搜索】图像渲染 && 岛屿数量
首先将起点位置放到队列中,然后进行循环,直到队列为空则停下来,而在循环过程中,将队头元素取出然后进行修改颜色,然后将对头元素邻近元素也就是上下左右四个元素,根据题目要求将符合的元素加入队列中,达到 bfs。 这里我们采用的修改方式是直接修改原数组,如果不直接修改原数组也是可以的,就得用一个 used。来解决问题,其实思路都是一样的,以每个元素为起点找寻所有的岛屿,并且记录数量,当遇到 1。,这样子可以减少许多不必要的重复遍历操作,并且不这么做的话,这道题也是会超时的!,从初始像素开始,记录初始坐标的。
2025-02-28 13:14:31
582
原创 【字符串】二进制求和 && 字符串相乘
中,以此类推,其实这种方式是不太好搞的,因为这道题它给的是字符串,并且顺序是正序,我们在实际操作的时候就可能会有前导零啊,边界的情况,所以这种模拟方式需要优化一下! 我们之前做过类似的求和问题,其实都是一样的,只不过这道题变成了字符串形式罢了,思路都还是一样的,只不过现在变成了逢二进一! 接下来我们需要处理的就只是对这个结果集数组进行进位处理,也是很简单,最后就能得到结果! 然后在处理相乘的每一个结果的时候,该位置对应在字符串 ret。 要注意的是在操作过程中,我们是对字符串的操作,所以需要。
2025-02-27 13:11:12
593
原创 【Linux基础IO】一、系统IO
我们知道 C语言有文件操作接口,那么当然 C++、JAVA这些语言都有文件操作接口。但是最让人烦的问题是这些语言之间的 IO接口都是不一样的,这样子导致我们学习成本很高! 这些语言拥有文件操作接口的目的找到文件,然后对文件进行操作。那么文件是在磁盘上,磁盘是属于硬件。对于硬件的访问只有操作系统才能进行。所有人想访问磁盘都不能绕开操作系统,C语言也好,其他语言也罢都是人表达出意思让操作系统理解我们想要干嘛,所以任何上层语言想要进行对磁盘进行操作,都会使用操作系统提供的接口。
2025-02-27 13:09:10
873
c/c++实现高并发内存池
2025-01-25
嵌入式软件服务器开发的毕业实习总结:温湿度监测系统的设计与实现
2025-01-25
(校内课程设计)c/c++实现停车场管理系统
2025-01-25
c++实现在线版五子棋(包含Websocket++、JsonCpp、Mysql、c++11、BlockQueue阻塞队列、HTML / CSS / JS / AJAX等技术栈的使用)
2025-01-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人