- 博客(72)
- 收藏
- 关注
原创 dfs二叉树中的深搜(回溯、剪枝)--力扣129、814、230、257
给定一个二叉树,树中每个节点存放一个0到9之间的数字,求从根节点到叶节点生成的所有数字之和。解法使用深度优先搜索(DFS)的前序遍历,整合父节点信息与当前节点信息计算当前节点数字,并递归向下传递,在叶子节点处返回结果。:给定一个二叉树,节点值为0或1,返回移除所有不包含1的子树的原二叉树。解法使用DFS的后序遍历,逐步删除叶子节点,保证删除后节点仍满足条件。:判断给定二叉树是否是有效的二叉搜索树。解法利用中序遍历,递归判断左子树是否为BST,当前节点是否满足BST条件,以及右子树是否为BST。
2025-04-16 23:49:39
496
原创 五道递归算法题--让你彻底爱上递归
摘要:1. 在面试题08.06.汉诺塔问题中,通过递归将所有盘子从柱子A移动到柱子C。2. 在21.合并两个有序链表中,通过递归合并两个升序链表为一个新的升序链表。3. 在206.反转链表中,通过递归实现链表的反转操作。4. 在24.两两交换链表中的结点中,通过递归交换链表中相邻的节点。5. 在50.Pow(x,n)中,通过递归实现计算x的n次幂函数。
2025-04-14 22:48:39
471
原创 Linux操作系统--进程优先级
所以我们可以通过调节nice值,当nice值为负数的时候,那么该程序的PRI变小,即其优先级会变高,则越快被执行。原因:因为资源是有限的,进程是多个的,注定了进程之间的竞争关系。需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。进程在从CPU上离开的时候,要将自己的上下文数据保存好,甚至带走。CPU内的寄存器里面保存的是进程相关的数据。
2025-04-12 20:24:40
1082
原创 Linux操作系统--进程状态
本文介绍了进程在操作系统中的不同状态,包括运行、阻塞、挂起等。进程状态可以通过观察任务状态数组中的标识来判断,其中包括运行状态(R)、睡眠状态(S)、磁盘休眠状态(D)、停止状态(T)、死亡状态(X)和僵尸状态(Z)等。作者还给出了查看进程状态和处理僵尸进程的代码示例,说明了僵尸进程的产生原因和影响,以及解决方法。此外,还介绍了孤儿进程的概念和示例代码,说明了孤儿进程可能导致的问题。文章内容详细介绍了进程状态管理和相关问题,对操作系统进程管理有一定的启发意义。
2025-04-11 15:25:41
912
原创 字符串计算算法题(对进位更加得心应手)--力扣67二进制求和,43字符串相乘
文章包含两道题目的解法:1. 第一道题目是“67.二进制求和”,要求给定两个二进制字符串,返回它们的和。解法使用了模拟十进制的大数相加的过程,通过遍历两个字符串同时进行相加并处理进位的操作,最终得到结果。2. 第二道题目是“43.字符串相乘”,要求给定两个以字符串形式表示的非负整数,返回它们的乘积。解法采用了无进位相乘然后相加的思路,首先进行数字相乘得到中间结果,然后处理进位并最终得到乘积的字符串形式。文章提供了题目链接、描述以及具体的代码解法,并且通过示例说明了解题思路。
2025-04-09 20:05:54
942
原创 Linux操作系统--进程的概念
这篇文章主要介绍了进程相关的概念和操作,包括了解进程前的背景知识和进程的具体内容。在了解进程前的背景知识部分,提到了冯诺依曼体系结构和操作系统的重要性。在进程的具体内容中,包括了进程的概念,描述进程相关的PCB内部结构,查看进程的方法,通过系统调用获取进程标识符,认识fork()函数创建新进程的过程。文章以代码示例的形式展示了如何获取进程的标识符,查看进程信息以及使用fork()函数创建新进程。整体而言,这篇文章是一个对进程概念和操作的简要介绍和实践指引。
2025-04-06 19:38:26
1111
原创 归并排序算啊模板and三道困难级别的归并力扣算法题--LCR170,493,315
这篇博文介绍了归并排序算法在解决交易逆序对、计算右侧小于当前元素数量、翻转对等问题中的应用。通过归并排序的分治思想,能够有效统计逆序对的数量和右侧小于当前元素的个数。同时,降序版本的归并排序也能应用在翻转对问题中。算法实现清晰,逻辑严谨,有效解决了这些问题。
2025-04-04 16:01:08
945
原创 快排算法模板and两道值得细品的快排算法题--力扣215、LCR159
本文介绍了快速排序算法的模板及其应用。首先给出了快速排序的模板代码,包括随机选择基准元素和将数组分三块的步骤。然后分别展示了两道题目的解法:1. 第一个题目是 LeetCode 215. 数组中的第K个最大元素,要求返回数组中第K个最大的元素。采用了时间复杂度为O(n)的快速排序算法解决此问题。2. 第二个题目是 LCR.159 库存管理,要求返回库存余量最少的cnt个商品余量,顺序不限。同样使用快速排序算法解决。每个解法都包含了基准元素的随机选择、数组分三块和递归处理的步骤。代码中使用了sra
2025-04-03 20:31:29
743
原创 前缀和算法题--力扣.560和974
找到在[0,i-1]区间内,有多少前缀和等于sum[i] - k即可。想知道有多少个以i为结尾的和为k的子数组,就要找到有多少个起始位置为x1,x2,x3···使得[x,i]区间内的所有的和为k。如果(a-b)% n == 0,那么我们可以得到一个结论:a%n == b%n。例如:(26-2)% 12 ==0,那么26%12 == 2%12 == 2。设i为数组中的任意位置,用sum[i]表示[0,1]区间内所有元素的和。设i为数组中的任意位置,用sum[i]表示[0,i]区间内所有元素的和。
2025-03-30 14:26:23
898
原创 二分查找模板--从题目中讲解三大二分模板
当mid指向左边的元素时,想要left = right,就必须right = mid,且right向左,所以是寻找左边界且right = mid,left = mid+1。当mid指向右边的元素时,想要left = right,就必须left = mid,且left向左,所以是寻找右边界且left = mid,right = mid-1。因为只有当left = right的时候才是找到边界。用的还是二分思想,就是根据数据的性质,在某种判断条件下将区间一分为二,然后舍去其中一个区间,然后再另一个区间内查找;
2025-03-27 23:21:48
1046
原创 (滑动窗口)算法训练篇11--力扣3.无重复字符的最长字串(难度中等)
研究对象依旧是一段连续的区间,因此继续使用滑动窗口思想来优化。让滑动窗口满足:窗口内所有元素都是不重复的。,请你找出其中不含有重复字符的。请注意,你的答案必须是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。,所以其长度为 3。,所以其长度为 1。,所以其长度为 3。
2025-03-22 22:05:28
437
原创 (滑动窗口)算法训练篇10--力扣9.长度最小的子数组(难度中等)
让滑动窗口满足:从i位置开始,窗口内所有元素的和小于target(那么当窗口内元素之和第一次大于等于目标值的时候,就是i位置开始,满足条件的最小长度)。虽然代码是两层循环,但我们的left指针和right指针都是不回退的,两个最多往后移动n次。因此时间复杂度是o(N)由于此问题分析的对象是一段连续的区间,因此可以考虑滑动窗口的思想来解决这道题。单调性(左右两个指针都是一直增或者一直减,并且不会超过对方)+同向指针。如果不存在符合条件的子数组,返回。是该条件下的长度最小的子数组。个正整数的数组和一个正整数。
2025-03-22 17:04:45
582
原创 优选算法训练篇08--力扣15.三数之和(难度中等)
稍微不同的是,题目种要求找到所有不重复的三元组。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。但是要注意的是,这道题里面需要有。答案中不可以包含重复的三元组。唯一可能的三元组和不为 0。唯一可能的三元组和为 0。,判断是否存在三元组。
2025-03-21 21:37:41
503
原创 优选算法训练篇07--力扣LCR179.查找总价格为目标值的两个商品
注意到本题是升序的数组,因此我们可以用对象指针优化时间复杂度。两层for循环列出所有两个数的组合,判断是否等于目标值。请在购物车中找到两个商品的价格总和刚好是。购物车内的商品价格按照升序记录于数组。若存在多种情况,返回任一结果即可。[27,34] 或者 [34,27][3,15] 或者 [15,3]
2025-03-20 19:31:10
817
原创 算法训练篇06--力扣611.有效三角形的个数
根据解法一中的优化思想,我们可以固定一个最长边,然后在比这条边小的有序数组中找出一个二元组,使这个二元组之和大于这个最长边。由于数组使有序的,我们可以利用对撞指针来优化。三层for循环枚举出所有的三元组,并且判断是否能构成三角形。,返回其中可以组成三角形三条边的三元组个数。2,3,4 (使用第一个 2)2,3,4 (使用第二个 2)给定一个包含非负整数的数组。
2025-03-20 19:30:58
484
原创 算法训练篇04--力扣11.盛水最多的容器
当我们不断重复上述过程,每次都可以舍去大量不必要的枚举过程,直到left与right相遇。期间产生的所有容积里面的最大值,就是最终的答案。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。由此可见,左边界和其余边界的组合情况都可以不用考虑。所以我们可以left++替换这个边界,继续判断下一个左右边界。解法一(暴力求解):计算出所有容器的体积,然后找出其中容积最大的值。轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
2025-03-19 22:06:11
328
原创 算法训练篇03--力扣202.快乐数
由于上述两种情况只会出现一种,因此,只要我们能确定循环是在情况一中进行,还是情况二中进行就能得到结果。为了方便叙述,对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。这一个操作数我们记为x。根据上述的题目分析,我们可以知道对n进行操作,迟早会陷入一个循环圈内。编写一个算法来判断一个数。
2025-03-19 06:00:00
379
原创 算法训练篇02--力扣1089.复写零
调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4],请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。注意:请不要在超过该数组长度的位置写入元素。调用函数后,输入的数组将被修改为:[1,2,3]进行原地复写操作的话,会导致没有复写的数。进行上述修改,不要从函数返回任何东西。给你一个长度固定的整数数组。
2025-03-18 14:16:01
686
2
原创 算法训练篇01 -- 力扣283.移动零
这个方法是快排算法中,数据划分过程的重要一步。如果将快排算法拆解的话,这一段小代码就是实现快排算法的核心步骤。
2025-03-17 13:51:32
484
原创 C++29--C++的类型转换
每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。RTTI:Runtime Type Information的简称,即:运行时类型识别。因此C++提出了自己的类型转化风格,注意。C++通过以下方式来支持RTTI。
2025-03-15 16:41:19
695
原创 C++28--特殊类设计
为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有套路的,后来孙武就总结出了《孙子兵法》。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
2025-03-13 18:06:25
1009
原创 C++27--智能指针
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。//1.内存申请了忘记释放//2.异常安全问题Func();//这里Func函数抛异常导致delete[] p3未执行,p3没被释放delete[]p3;
2025-03-10 07:32:15
887
原创 C++26--包装器(function bind)
arg_list中的参数可能包含形如_n的名字,其中n是一个整数,这些参数是“占位符”,表示newCallable的参数,它们占据了传递给newCallable的参数的“位置”。一般而言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M可以大于N,但这么做没什么意义)参数的新函数。C++中的function本质是一个类模板,也是一个包装器。其中,newCallable本身是一个可调用对象,arg_list是一个逗号分割的参数列表,对应给定的callable的参数。
2025-03-09 12:16:09
514
原创 C++25--lambda表达式
比如:[=.&a,&b]:以引用传递的方式捕捉变量a和b,值传递方式捕捉其他所有变量[&, a, this]: 值传递方式捕捉变量a和this,引用方式捕捉其他变量。通过上述例子可以看出,lambda表达式实际上可以理解为无名函数,该函数无法直接调用,如果想要直接调用,可借助auto将其赋值给一个变量。函数对象,又称为仿函数,即可以像函数一样使用的对象,就是在类中重载了operator()运算符的类对象。上述代码就是使用C++11中的lambda表达式解决,可以看出lambda表达式实际是一个匿名函数。
2025-03-08 21:45:41
1113
原创 C++24--右值引用C++11新特性
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。
2025-03-05 19:23:51
994
原创 C++23--位图和布隆过滤器
我们在使用新闻客户端看新闻时,它会给我们不停的推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。一种支持删除的方法:将布隆过滤器中的每个比特位扩展成一个小的计数器,插入元素时给k个计数器(k个哈希函数计算出的哈希地址)加1,删除元素时,给k个计数器减1,通过多占用几倍存储空间的代价来增加删除操作。比如:在布隆过滤器中查找”alibaba“时,假设3个哈希函数计算的哈希值为:1、3、7,刚好和其它元素的比特位重叠,此时布隆过滤器告诉该元素存在,但实该元素是不存在的。通常是用来判断某个数据存不存在的。
2025-03-02 20:37:52
1147
原创 C++22——哈希
unordered_map在线文档说明unordered_map是存储<key,value>键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。在unordered_map中,键值对常用于唯一的标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同在内部,unordered_map没有对<key,value>按照任何特定的顺序排列,为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
2025-03-01 22:44:51
1198
原创 C++21--红黑树
目录1.红黑树的概念2.红黑树的性质3.红黑树结点的定义4.红黑树的结构5.红黑树的插入操作6.红黑树的验证7.红黑树与AVL树的比较4.红黑树的结构1.按照二叉搜索的树规则插入新结点2.检查新结点插入后,红黑树的性质是否造到破坏约定:cur为当前节点,p为父节点,g为祖父节点,u为叔叔节点情况一:cur为红,p为红,g为黑,u存在且为红注意:此处看到的树,可能是一颗完整的树,也可能是一颗子树如果g是根节点,调整完成后,需要将g改为黑色如果g是子树,g一定有双气囊,且g的双亲如果是红色,
2025-02-24 19:55:50
906
原创 C++19--异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了//服务器开发中通常使用的异常继承体系public:,_id(id){}protected:int _id;
2025-01-25 21:20:09
1217
原创 C++18--二叉树搜索树
如果我们直接删除,就变得非常困难,于是我们想办法变成b和c的情况,所以就替换值的位置后再删除。替换的值要么是删除结点的左子树最大的结点或者右子树最小的结点)对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。,通过英文可以快速找到与其对应的中文,英文单词与其对应的中文就构成一种键值对;:二叉搜索树退化为单支树(或者类似单支),其平均比较次数为:N的二次方;1.二叉搜索树的查找。
2025-01-17 16:10:54
865
原创 C++17--多态
多态是在不同继承关系的类对象,去调用同一个函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上 = 0;则这个函数为纯虚函数。包含纯虚数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。
2025-01-12 22:17:33
796
原创 C++16--继承
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用public:protected://姓名//年龄//继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了Student//和Teacher复用了Person的成员。
2025-01-08 22:30:29
896
原创 C++15——模板(浅识)
class 类模板名//类内成员定于//动态顺序表//注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public:,_size(0){}//使用析构函数演示:在类中声明,在类外定义~Vector();//注意:类模板中函数放在类外进行定义时,需要加模板参数列表。
2024-12-21 18:42:38
687
2
原创 C++14--内存管理(new delete)
int main()//new/delete和malloc/free最大区别是new/delete对于[自定义类型]除了开空间//还会调用构造函数和析构函数free(p1);delete p2;//内置类型是几乎是一样的free(p3);delete p4;free(p5);return 0;
2024-12-20 21:08:23
1982
4
原创 C++13--内部类 和 对前面类和对象知识的小回顾
内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。
2024-12-20 00:00:00
409
原创 C++11--explicit和static成员
构造函数不仅可以构造与初始化对象,对于接收单个参数的构造函数,还具有类型转换的作用。上述代码可读性不是很好,用explicit修饰构造函数,将会禁止构造函数的隐式转换。实现一个类,计算程序中创建出了多少个类对象?
2024-12-19 14:50:00
417
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人