自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【优选算法】二分算法模板总结及应用

▪ 当 nums[mid] < target 时,说明 mid 落在了 [left, index - 1] 区间上,mid 右边但不包括 mid 本⾝,可能是最终结果,所以我们接下来查找的区间在 [mid + 1, right]上。◦ 当 mid 落在 [resRight+ 1, right] 的区间的时候,说明 [mid, right] 内的元素是可以舍去的,此时更新 right 到 mid - 1 的位置;说明 [left, mid] 都是可以舍去的,此时更新 left 到 mid + 1 的位置,

2025-03-20 21:37:01 992

原创 【优选算法】二分查找 在排序数组中查找元素的第⼀个和最后⼀个位置

◦ 当 mid 落在 [resRight+ 1, right] 的区间的时候,说明 [mid, right] 内的元素是可以舍去的,此时更新 right 到 mid - 1 的位置;• 左指针: left = mid ,可能会原地踏步(⽐如:如果向下取整的话,如果剩下 1,2 两个元素, left == 1, right == 2,mid == 1。◦ 当 mid 落在 [resLeft, right] 的区间的时候,也就是 arr[mid] >= target。

2025-03-20 21:36:37 315

原创 【优选算法】二分查找

ii. arr[mid] > target 说明 [mid, right] 这段区间都是⼤于 target 的,因此舍。iii. arr[mid] < target 说明 [left, mid] 这段区间的值都是⼩于 target 的,因。此舍去左边区间,在右边 [mid + 1, right] 区间继续查找,即让 left = mid +去右边区间,在左边 [left, mid -1] 的区间继续查找,即让 right = mid -a. 定义 left , right 指针,分别指向数组的左右区间。

2025-03-18 09:12:07 344

原创 【优选算法】滑动窗口 最⼩覆盖⼦串

a. 定义两个全局的哈希表: 1 号哈希表 hash1 ⽤来记录⼦串的信息, 2 号哈希表 hash2。b. 初始化⼀些变量:左右指针: left = 0,right = 0;ii. 如果不想等,说明匹配,返回 s 中从 retleft 位置往后 len ⻓度的字符串。• 如果 t 中某个字符的数量⼤于窗⼝中字符的数量,也就是 2 号哈希表某个位置⼤于。◦ 判断完毕后,将左侧元素滑出窗⼝,顺便更新 1 号哈希表;i. 将当前遍历到的元素扔进 1 号哈希表中;i. 如果相等,说明没有匹配,返回空串;

2025-03-18 09:11:40 254

原创 【优选算法】滑动窗口 串联所有单词的⼦串

如果我们把每⼀个单词看成⼀个⼀个字⺟,问题就变成了找到「字符串中所有的字⺟异位词」。⽆⾮就是之前处理的对象是⼀个⼀个的字符,我们这⾥处理的对象是⼀个⼀个的单词。

2025-03-01 23:28:48 413

原创 【优选算法】滑动窗口 找到字符串中所有字母异位词

◦ 因为字符串 p 的异位词的⻓度⼀定与字符串 p 的⻓度相同,所以我们可以在字符串 s 中构造⼀个⻓度为与字符串 p 的⻓度相同的滑动窗⼝,并在滑动中维护窗⼝中每种字⺟的数量;◦ 因此可以⽤两个⼤⼩为 26 的数组来模拟哈希表,⼀个来保存 s 中的⼦串每个字符出现的个数,另⼀个来保存 p 中每⼀个字符出现的个数。这样就能判断两个串是否是异位词。◦ 当窗⼝中每种字⺟的数量与字符串 p 中每种字⺟的数量相同时,则说明当前窗⼝为字符串 p的异位词;

2025-03-01 23:28:13 576

原创 【优选算法】滑动窗口 水果成篮

▪ 如果⼤⼩超过 2:说明窗⼝内⽔果种类超过了两种。那么就从左侧开始依次将⽔果划出窗⼝,直到哈希表的⼤⼩⼩于等于 2,然后更新结果;b. 初始化变量:左右指针 left = 0,right = 0,记录结果的变量 ret = 0;做法:右端⽔果进⼊窗⼝的时候,⽤哈希表统计这个⽔果的频次。▪ 如果没有超过 2,说明当前窗⼝内⽔果的种类不超过两种,直接更新结果 ret。◦ 将左侧元素滑出窗⼝,并且在哈希表中将该元素的频次减⼀;让滑动窗⼝满⾜:窗⼝内⽔果的种类只有两种。i. 将当前⽔果放⼊哈希表中;

2025-02-26 20:41:26 287

原创 【优选算法】滑动窗口 将 x 减到 0 的最小操作数

要,必须设定与代码⼀致),记录当前滑动窗⼝内数组和的变量 sum = 0 ,记录当前满⾜条件数组的最⼤区间⻓度 maxLen = -1;iii. 如果经过前两步的左右移动使得 sum == target ,维护满⾜条件数组的最⼤⻓度,并让下个元素进⼊窗⼝;ii. 如果 sum > target ,右移左指针,直⾄变量和⼩于等于 target ,或左指针已经移到头;i. 如果 sum < target ,右移右指针,直⾄变量和⼤于等于 target ,或右指针已经移到头;否则,返回 -1。

2025-02-26 20:40:54 374

原创 【优选算法】滑动窗口 最大连续1的个数

a. 初始化⼀个⼤⼩为 2 的数组就可以当做哈希表 hash 了;初始化⼀些变量 left = 0 ,right = 0 , ret = 0;不要去想怎么翻转,不要把问题想的很复杂,这道题的结果⽆⾮就是⼀段连续的 1 中间塞了 k个 0 嘛。因此,我们可以把问题转化成:求数组中⼀段最⻓的连续区间,要求这段区间内 0 的个数不超过 k 个。• 如果超标,依次让左侧元素滑出窗⼝,顺便更新哈希表的值,直到 0 的个数恢复正。iii. 程序到这⾥,说明窗⼝内元素是符合要求的,更新结果;

2025-02-25 08:00:47 305

原创 【优选算法】滑动窗口 ⽆重复字符的最⻓⼦串

▪ 如果这个字符出现的频次超过1 ,说明窗⼝内有重复元素,那么就从左侧开始划出窗⼝,直到ch这个元素的频次变为1 ,然后再更新结果。在往后寻找⽆重复⼦串能到达的位置时,可以利⽤「哈希表」统计出字符出现的频次,来判断什么时候⼦串出现了重复元素。枚举「从每⼀个位置」开始往后,⽆重复字符的⼦串可以到达什么位置。找出其中⻓度最⼤的即可。研究的对象依旧是⼀段连续的区间,因此继续使⽤「滑动窗⼝」思想来优化。▪ 如果没有超过1 ,说明当前窗⼝没有重复元素,可以直接更新结果。让滑动窗⼝满⾜:窗⼝内所有元素都是不重复的。

2025-02-25 07:59:56 242

原创 【优选算法】滑动窗口 ⻓度最⼩的⼦数组

▪ 如果窗⼝内元素之和⼤于等于target :更新结果,并且将左端元素划出去的同时继续判断是否满⾜条件并更新结果(因为左端元素可能很⼩,划出去之后依旧满⾜条件)让滑动窗满⾜:从i 位置开始,窗⼝内所有元素的和⼩于target(那么当窗⼝内元素之和第⼀次⼤于等于⽬标值的时候,就是i位置开始,满⾜条件的最⼩⻓度)。然后从这个「起始位置」开始,然后寻找⼀段最短的区间,使得这段区间的和「⼤于等于」⽬标值。▪ 如果窗⼝内元素之和不满⾜条件: right++ ,另下⼀个元素进⼊窗⼝。

2025-02-24 21:42:00 357

原创 【优选算法】四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target。b. 在这个数a的后⾯区间上,利⽤「三数之和」找到三个数,使这三个数的和等于target- a 即可。你可以按 任意顺序 返回答案。a、b、c 和 d 互不相同。a. 依次固定⼀个数a;

2025-02-24 21:41:49 230

原创 【优选算法】双指针 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。那么三数之和就是固定一个数,找到两个数相加等于固定这个数的相反数,于是三数之和🟰0;3️⃣ 在这个数后面的区间内,使用「双指针算法」快速找到两个数之和等于 -a 即可。(2)当使用完一次双指针算法之后,固定的 a 也要「跳过重复」的元素;本题是三数之和,我们可以结合两数之和的思路来解本题。

2024-10-19 20:15:09 318 1

原创 【C++】map和set的封装

二叉搜索树的中序遍历是升序,如果对某一个数++,那么结果则是中序遍历的下一个数,那么我们如何根据一个值在红黑树当中找到它中序遍历的下一个值呢?STL明确规定,begin()与end()代表的是一段前闭后开的区间,而对红黑树进行中序遍历后,可以得到一个有序的序列,因此:begin()可以放在红黑树中最小节点(即最左侧节点)的位。置,end()放在最大节点(最右侧节点)的下一个位置,关键是最大节点的下一个位置在哪块?中序遍历(升序),右不为空的时候,就需要找到右子树的最左节点,并返回该节点。

2024-10-19 18:04:03 679

原创 【Linux】命令行参数&&环境变量

按理来说,大部分指令也都是程序,执行后也会创建新的进程,那为什么我们使用类似ls这样的指令不需要在前面加上路径呢?bash进程时test2进程的父进程,在bash进程中修改了环境变量,其子进程mytest也会收到一份几乎一模一样的环境变量表,也就能找到我们刚才的变量MYENV了。将我们的程序拷贝到PATH里的路径就可以了,比如将mytest拷贝到/usr/bin目录下,该目录存放的都是可以直接运行的指令。所有的环境变量都存放在一张表里面,这张表的每一个元素都是一个指针,指向一个表示环境变量的字符串。

2024-10-18 19:15:43 1412

原创 【优选算法】双指针 查找总价格为目标值的两个商品

购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。需要注意的是leetcode这里需要返回一个值,强行返回一个值照顾编译器。3.直接返回,这里是返回两个数的一个数组,用一组大括号就能返回。1.当加和小于目标时,left++2.当大于目标时,right–

2024-10-18 08:46:55 293

原创 【Linux】进程优先级&&进程切换

在操作系统中,进程优先级(Process Priority)是指操作系统对进程进行调度时所赋予的优先级值,用于决定进程何时获得处理器时间。进程优先级是一种实现多任务操作系统中任务调度的重要机制,它允许操作系统根据进程的重要性和紧迫性来分配处理器资源。

2024-10-17 11:11:05 1339

原创 【优选算法】双指针 有效三角形的个数

▪ 说明 [left, right - 1] 区间上的所有元素均可以与 nums[right] 构成⽐。▪ 说明 left 位置的元素是不可能与 [left + 1, right] 位置上的元素构成满⾜条件。▪ 此时 right 位置的元素的所有情况相当于全部考虑完毕, right-- ,进⼊下⼀轮判断。根据「解法⼀」中的优化思想,我们可以固定⼀个「最⻓边」,然后在⽐这条边⼩的有序数组中找。▪ 因此我们可以先将原数组排序,然后从⼩到⼤枚举三元组,⼀⽅⾯省去枚举的数量,另⼀⽅。nums[i] ⼤的⼆元组。

2024-10-17 11:10:18 262

原创 【优选算法】双指针 盛水最多的容器

◦ 如果改变右边界,⽆论右边界移动到哪⾥,新的⽔⾯的⾼度⼀定不会超过左边界,也就是不会超过现在的⽔⾯⾼度,但是由于容器的宽度减⼩,因此容器的容积⼀定会变⼩的。容器的⾼度由两板中的短板决定,因此可得容积公式 : v = (j - i) * min( height[i], height[j])◦ 由于左边界较⼩,决定了⽔的⾼度。如果改变左边界,新的⽔⾯⾼度不确定,但是⼀定不会超过右边的柱⼦⾼度,因此容器的容积可能会增⼤。设两指针 i , j ,分别指向⽔槽板的最左端以及最右端,此时容器的宽度为 j - i。

2024-10-16 07:38:27 436

原创 【优选算法】双指针 快乐数

我们可以假设一个比他更大的数 整形最大数约为10位数,且最大的数一定不会超过99999 99999。我们来计算这个数每个位置上的数字的平方和,9^2 * 10 = 810,也就是最大的数是810。两种情况我们可以归结为一种情况,那就是用快慢指针判断是否有环,且快慢指针相遇的位置是否为1。题目n最小为1,所以每个位置上的数字平方和的范围在 [1,810] 之间,有810个数。◦ 对于⼀个正整数,每⼀次将该数替换为它每个位置上的数字的平⽅和。n个巢,有n+1个鸽子,可以推出至少有一个巢,里面的鸽子数大于。

2024-10-16 07:38:05 692

原创 【优选算法】双指针 复写0

如果「从前向后」进⾏原地复写操作的话,由于 0 的出现会复写两次,导致没有复写的数「被覆盖掉」。给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。但是「从后向前」复写的时候,我们需要找到「最后⼀个复写的数」,因此我们的⼤体流程分两。a. 初始化两个指针 cur = 0 , dest = 0;• 判断dest 时候已经到结束位置,如果结束就终⽌循环;• 如果没有结束, cur++ ,继续判断。ii. 然后从后向前进⾏复写操作。i. 先找到最后⼀个复写的数;

2024-10-15 11:22:26 441

原创 【优选算法】双指针 移动0

• dest++ 之后,指向的元素就是 0 元素(因为⾮零元素区间末尾的后⼀个元素就是0 ),因此可以交换到cur 所处的位置上,实现 [0, dest] 的元素全部都是⾮零元素, [dest + 1, cur - 1] 的元素全是零。• 因为 dest 指向的位置是⾮零元素区间的最后⼀个位置,如果扫描到⼀个新的⾮零元素,那么它的位置应该在 dest + 1 的位置上,因此 dest 先⾃增 1;ii. 遇到的元素不是 0 , dest++ ,并且交换 cur 位置和 dest 位置的元素,之后让。

2024-10-15 11:22:02 295

原创 【Linux】进程状态

根据冯诺依曼体系结构,显示器是一个外设,所以CPU在跑当前的程序时,把数据写入到我们当前的内存中,打印数据的顺序:先写入到内存里,再刷新到外设这里。可是我们无法保证每次打印的时候,显示器的状态都是就绪的,因为程序是CPU跑的,CPU的运算速度要比显示器本身的速度要快的多,这种快慢人是无法感知的,所以进程在被调度的时候,要访问显示器的资源,因为资源要一直在显示器上打,所以大部分时间,我们的进程一直在等待我们的设备资源是否准备就绪。2.独立性,父进程只读取子进程的信息,不对信息做修改,依旧保持独立性。

2024-10-14 12:42:10 1402

原创 【Linux】实现倒计时、进度条、gdb

​ b.进程退出刷新 当进程正常退出时,缓冲区会自动刷新,以确保所有已写入缓冲区但尚未写入目标设备的数据都被处理完毕。在没有缓冲区的情况下,每次文件读写操作都需要等待外设(如磁盘)就绪,这可能会导致显著的等待时间。缓冲区减少了这种等待时间,因为数据可以暂时存储在内存中,进程可以继续执行其他任务,而无需等待外设操作完成。先输入到我们的缓冲区,再执行sleep(执行顺序是不变的),执行完sleep后,再将输入内容输出到显示器上。缓冲区的刷新策略决定了何时将缓冲区中的数据真正写入到目标存储器,如磁盘或显示器。

2024-10-14 12:41:56 1288

原创 【Linux】进程概念 进程&&进程的查看与管理&&创建进程

❍ 课本概念:程序的一个执行实例,正在执行的程序等❍ 内核观点:担当分配系统资源(CPU时间,内存的实体)简单来说:进程 == PCB(进程控制块) + 进程对应的代码和数据;一个进程对应一个PCB操作系统对进程的管理,最终变成了对链表的增删查改。注意:可执行程序加载到内存不是进程,只是进程对应的代码和数据。

2024-10-12 20:52:38 745

原创 【C++】红黑树

/ 节点的颜色// 红黑树节点的定义{}// 节点的左孩子// 节点的右孩子// 节点的双亲(红黑树需要旋转,为了实现简单给出该字段)// 节点的值域// 节点的颜色。

2024-10-12 20:52:22 1124

原创 【Linux】冯诺依曼体系&&操作系统概念

计算机管理硬件描述起来,用struct结构体组织起来,用链表或其他高效的数据结构。

2024-10-11 15:21:00 539

原创 【Linux】makefile

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。一个文件是由内容+属性组成,如果文件内容被修改,那么文件的大小也会被修改,相应的属性修改时间也会改变,并且可执行文件形成的时间一定比源文件晚(这是操作顺序的原因),所以只需要比较两者的时间,只要可执行文件的时间比源文件晚,就说明这个可执行文件一定是最新的。@ 是一个特殊变量,它代表当前规则的目标文件名;

2024-10-11 15:20:49 1056

原创 【C++】AVL树

{}// 该节点的左孩子// 该节点的右孩子// 该节点的双亲T _data;int _bf;// 该节点的平衡因子。

2024-10-10 22:46:43 1157

原创 【C++】set和map

set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。set在底层是用二叉搜索树(红黑树)实现的。

2024-10-10 22:46:31 1111

原创 【Linux】yum、vim、gcc/g++

1.在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.2.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.3.软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系.

2024-10-09 12:54:46 1019

原创 【C++】二叉搜索树

那能否进行改进,不论按照什么次序插入关键码,二叉搜索树的性能都能达到最优?对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。a、从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。2.若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。b. 树不空,按二叉搜索树性质查找插入位置,插入新节点。3.它的左右子树也分别为二叉搜索树。

2024-10-09 12:54:30 975

原创 【C++】多态

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上 =0,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。

2024-10-08 08:07:06 972

原创 【C++】继承

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了Student和Teacher复用了Person的成员。

2024-10-08 08:06:30 1254

原创 【强训笔记】day27

思路:先按照左端点排序,将第一个的右端点放入队列,将后一个的左端点与之对比,若后一个的左端点大于前一个的右端点说明没有重叠部分,删除前一个右端点,加入该点的右端点,最后返回队列的size。思路:bfs遍历实现,dist用来标记是否走过和记录最小步数。

2024-10-07 21:43:11 214

原创 【强训笔记】day26

思路:先排序,在利用滑动窗口,如果最左边和最右边值的差大于两倍的p就出窗口,更新结果。思路:只需判断长度为2和3的回文子串。

2024-10-07 21:43:01 244

原创 【强训笔记】day25

【强训笔记】day25

2024-05-22 21:59:47 507 1

原创 【强训笔记】day24

【强训笔记】day24

2024-05-22 21:59:27 366 1

原创 【算法学习】拓扑排序

【算法学习】拓扑排序

2024-05-15 15:48:18 778 2

原创 【强训笔记】day23

【强训笔记】day23

2024-05-14 19:57:09 453

空空如也

空空如也

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

TA关注的人

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