- 博客(99)
- 收藏
- 关注
原创 2024.8.24 刷题总结
239.滑动窗口的最大值,这道题考察的是滑动窗口和队列的知识,刚开始看错题目了,求成了滑动窗口可能出现的最大值和出现最大值的滑动窗口内容,但题目要求的是滑动窗口每次滑动中内部的最大元素。300.最长递增子序列,这是一道非常经典的动态规划题目,一样是从前往后遍历更新状态,我们需要用一个数组来维护以每个元素结尾的最长上升子序列,结果最小是1,双循环遍历每个元素,如果在每个元素前找到比自己小的,那么就更新一次答案,最终答案为以每个元素为结尾的最长递增子序列中的最大值。
2024-08-24 15:15:45
79
原创 2024.8.23 刷题总结
279.完全平方数,这道题考察的是动态规划的知识,依题意得,我们需要找到最少的平方数之和使得等于要求的数,我们首先会想到用离该数最近的完全平方数来考虑,但是这样不方便枚举和遍历,所以我们采用动态规划的一般方法,先处理前面的数,再遍历到后面的数。198.打家劫舍,这道题是一道简单的入门动态规划问题,根据题目意思,我们不能取数组中相邻的元素然后还必须满足总结果最大,所以我们可以维护一个数组,用来保存在数组每个位置之前能取到的最大值,然后最后输出第n-1个元素的值即为答案。
2024-08-23 16:54:51
324
1
原创 2024.7.29 刷题总结
682.棒球比赛,这道题是一道简单的模拟题,用栈模拟题中的四个操作就可以了,操作一是将x加到列表末尾,操作二是将列表的后两项之和加到列表末尾,操作三是把列表最后一项的两倍加到列表末尾,操作四是去掉列表最后一项。LCR 100.三角形最小路径和,这道题是一道入门的动态规划题目,当然也可以用dfs来求解。我们只需要用一个数组来记录到达每个点需要的最小路径,然后再把最后一行取一个最小值即可。
2024-07-29 19:31:24
161
1
原创 2024.7.28 刷题总结
首先定义一个转化为大根堆的函数,每次从最后一个非叶节点开始向上遍历,判断当前节点和左右节点的大小关系来建立大根堆,然后再更新当前索引,即递归的思想,每次以当前节点为根节点往下交换节点,maxHeapify函数的作用是将当前节点作为根节点实现大根堆,buildMaxHeap函数的作用是建立初始大根堆,从数组大小的一半作为索引开始往上建立。先建立初始大根堆,然后循环n-k+1次,每次先把堆顶和堆尾节点交换,然后数组大小减一,代表把堆尾元素删除,即原来的堆顶元素,然后继续建立新的大根堆,直到取出第k大的元素。
2024-07-28 18:49:24
538
原创 Linux 下的项目开发:从入门到精通
Debian 系统提供了一套完整的工具和流程来创建、管理和分发软件包。通过遵循 Debian 的最佳实践和使用其提供的工具,你可以确保你的软件包易于安装、升级和维护。Linux 系统提供了一个强大且灵活的开发环境。通过本文,你应该对如何在 Linux 下进行项目开发有了基本的了解。从环境搭建到代码管理,再到最终的部署,每一步都是确保项目成功的关键。
2024-07-19 22:46:19
1551
原创 2024.7.19 刷题总结
543.二叉树的直径,这道题是一道考察递归的题目,按照树的一般算法,维护一个最大直径答案值,定义一个递归函数,开头是递归返回条件,即当前节点为空节点就返回0,否则分别往左和往右递归,维护每个节点的最大深度为左右最大深度中的最大值再加一,答案用左右节点的最大深度的和再加一来维护.124.二叉树中的最大路径和,这是一道考察递归的题目,从根节点出发,类似于dfs,分别递归寻找左右节点的路径和,直到叶子节点再返回,从叶子节点往上更新以每个节点为根节点的最大路径,直到返回根节点,用一个变量来维护答案.
2024-07-19 22:36:19
359
原创 深入QLora大模型微调:原理与实践
由于QLora是一个虚构的模型,我将提供一个基于真实存在的预训练模型BERT的微调示例,使用Python和Hugging Face的Transformers库。QLora模型的微调是一个涉及多个步骤的复杂过程,但通过合理的策略和细致的调整,可以显著提升模型在特定任务上的表现。它通过减少自注意力层中的Query数量,降低了模型的参数量和计算成本,同时通过特殊的权重分配策略,保持了对关键信息的捕捉能力。根据任务的特点选择合适的损失函数,如交叉熵损失、序列损失等,以指导模型在微调过程中的学习方向。
2024-07-16 19:00:05
1270
原创 2024.7.16 刷题总结
2956.找到两个数组公共的公共元素,这道题是一个哈希表的简单题目,根据题意,我们需要统计的是每个数组在另外一个数组中也存在的元素个数,所以我们建立两个哈希表,分别统计两个数组中出现的元素的情况,数据范围很小,这里选用数组模拟哈希表或者用STL的哈希表都可以完成,统计完之后再分别遍历两个数组找出答案即可。
2024-07-16 15:55:34
295
原创 BERT架构的深入解析
BERT通过其双向Transformer编码器和预训练策略,在各种NLP任务中取得了卓越的性能。其成功不仅展示了预训练模型的强大能力,也为NLP研究和应用带来了新的方向和思路。随着研究的深入和技术的进步,BERT及其变种将在更多的应用场景中展现出其强大的潜力和价值。
2024-07-15 15:54:14
653
原创 Transformer架构的深入解析
Transformer架构主要由编码器(Encoder)和解码器(Decoder)两部分组成,每部分又包含多个相同的层。每一层包含两大核心组件:多头自注意力机制(Multi-Head Self-Attention)和前馈神经网络(Feed-Forward Neural Network)。Transformer架构通过其创新的自注意力机制和并行计算能力,解决了传统RNN和LSTM模型在处理长序列时的瓶颈,成为了现代NLP领域的主流方法。其在各种NLP任务中的优异表现,充分展示了其强大的能力和广泛的应用前景。
2024-07-15 12:29:20
833
原创 自然语言处理技术的发展过程
自然语言处理技术的发展历程展示了从规则驱动到统计模型,再到深度学习和预训练模型的演变过程。每一个阶段的技术进步都为NLP领域带来了新的可能性,使得计算机能够更加智能地理解和处理人类语言。未来,随着计算能力的进一步提升和新技术的不断涌现,NLP技术必将在更多应用场景中展现出其强大的潜力和价值。
2024-07-15 12:24:00
1062
原创 2024.7.15 刷题总结
对于一个节点,只要左节点往下走或者右节点往下走有一条路是成功的,那么就返回true,所以递归的思路就明确了,还需要再写出结束条件,如果节点为空,那么就返回false,如果节点左右节点均为空,则需要判断当前节点值和剩下的目标值是否相等,递归的时候我们就是用当前root的左右节点两种情况来判断,而且目标值每次需要减去当前节点的值,这个是关键。可以考虑迭代的思想,用一个队列来存储需要判断的节点,刚开始存储的是根节点的左右节点,每次从队列中取出两个节点,然后先判断特殊情况,空指针和值不相等的问题。
2024-07-15 12:12:31
149
原创 面向对象设计(OOD)实践:探索组合、聚合和关联
面向对象设计(OOD)不仅是一种编程范式,更是一种思考问题和设计解决方案的方式。在OOD中,关系是对象之间交互的核心。本文将通过具体例子,深入探讨组合(Composition)、聚合(Aggregation)和关联(Association)这三种常见的对象关系模式。
2024-07-14 15:45:20
219
原创 C++中的多态:虚函数与纯虚函数详解
在C++中,虚函数是在基类中使用virtual关键字声明的函数。当基类指针或引用指向派生类对象时,调用虚函数将执行派生类中的版本。public:public:void display() override { // 使用 override 确保函数被正确重写纯虚函数在基类中使用virtual关键字和= 0来声明。public:// 纯虚函数。
2024-07-14 15:36:20
483
原创 递归算法详解及其应用
递归是指在函数的定义中调用函数自身。基准情况:不再调用自身的情况,直接返回结果。递归情况:将问题分解为更小的子问题,并调用自身来解决这些子问题。
2024-07-14 13:58:03
655
原创 2024.7.14 刷题总结
807.保持城市天际线,这是一道简单的矩阵和数学问题,题目的意思是增加那些高度较小的建筑,不影响四面的视图,所以我们很快就能明白限制的因素是该建筑所在行和所在列的最大值,取它们两者之间的更小值减去原始高度即为所求。刚开始看到这道题时,还以为需要预处理出四个面的结果,但是仔细一想发现,左右和上下的视图是相同的,所以只需要处理两个面的结果就可以,即每行和每列的最大值。226.翻转二叉树,这道题是一道典型的递归题目,我们需要先翻转叶子节点,然后再整体把整个左右子树调换,所以需要从最下层开始翻转,符合递归的条件。
2024-07-14 13:51:33
198
原创 C++中的封装和抽象
抽象是指通过暴露对象的必要特性和行为,而隐藏其具体实现细节。抽象帮助我们专注于对象的高层次特征,而忽略低层次的实现细节。在C++中,抽象通常通过抽象类和接口来实现。抽象的优点简化复杂性:通过抽象,只关注对象的行为,而不关心其具体实现。提高可维护性:通过定义清晰的接口,降低代码的耦合度。代码复用:抽象可以定义通用的接口,使不同的类可以复用相同的代码。
2024-07-13 20:36:33
459
原创 C++中动态内存分配:深入理解与实践
在C++中,内存分配分为栈内存分配和堆内存分配。栈内存分配是自动的,由编译器管理,而堆内存分配需要程序员手动管理。动态内存分配主要涉及堆内存。自定义内存分配器需要实现allocate和deallocate方法,并与public:// 实现内存分配逻辑// 实现内存释放逻辑。
2024-07-13 16:20:40
387
原创 Pandas使用手册大全
Pandas 是一个功能强大的数据分析库,通过本文介绍的基本用法和具体例子,相信你已经初步掌握了 Pandas 的使用方法。实际应用中,Pandas 提供了更多高级功能,可以进一步探索和学习,以便更高效地处理和分析数据。
2024-07-13 12:42:05
903
原创 2024.7.13 刷题总结
94.二叉树的中序遍历,这道题是一个简单的栈辅助遍历的题目,我们首先需要初始化一个答案数组和栈来辅助。然后根据中序遍历的意思,只要当前节点不为空或者栈不为空,就说明还有节点未遍历,我们就一直将root节点移动到它的左节点,直到变为空指针,这时候我们就可以将栈顶弹出,将该值加入答案数组,然后访问右节点,这样就实现了永远优先访问左节点,直到为空指针再访问中节点,再访问右节点,而当出现右节点也为空指针时,就会继续弹出栈顶的节点,继续向上遍历。栈里面只存放了所有左节点,而右节点需要手动遍历。
2024-07-13 12:32:08
299
原创 计算机网络高频面试题
从输入URL到展现页面的全过程:TCP三次握手以及四次挥手的流程:为什么需要三次握手以及四次挥手:TCP与UDP在网络协议中的哪一层,他们之间有什么区别?:HTTP与HTTPS有哪些区别?:简述DDOS攻击原理,如何防范它?:简述HTTP1.0,1.1,2.0的主要区别:简述TCP的TIME_WAIT和CLOSE_WAIT:TCP的TIME_WAIT和CLOSE_WAIT:TCP中常见的拥塞控制算法:BGP协议和OSPF协议的区别:TCP的keepalive了解吗?以及它和HTTP的keepalive的区别
2024-07-12 10:42:00
1544
原创 2024.7.12 刷题总结
457.环形数组是否存在循环,这道题是一个考察快慢指针的题目,将数组中的n个点看作图中的n个节点,再将i+nums[i]看作每个节点延伸出去的单向边,所以现在题目变成判断有无环路的题目,这时我们就可以遍历数组,初始化快慢指针,快指针在慢指针前面一步,然后每次快指针走两步,慢指针走一步,直到他们相遇。还需要标记一个已经走的步数,最后判断答案时,步数需要大于1才是有效的答案,并且在走的过程中,需要设置步数大于一定值自动退出,否则会出现runtime error.然后我们再遍历数组加上答案即可。
2024-07-12 10:35:23
370
原创 2024.7.11 刷题总结
206.反转链表,本题考察的是链表的基本性质,在反转操作时,我们可以看作是将当前节点的后继节点改为前驱节点,遍历一次即可完成。这个操作就相当于先确定最后一个节点,然后依次往前确定节点。然后从最后一个元素开始遍历,直到出现非下降元素就终止,每遍历一个元素,就找出最大的前缀满足连接处的大小关系,然后再叠加答案。160.相交链表,这道题用的是哈希表来存储链表的节点,我们先遍历A链表,将所有节点加入哈希表中,然后再遍历链表B,如果在哈希表中找到了对应值,那么就返回该值,否则返回空指针。
2024-07-11 18:56:16
625
原创 2024.7.10 刷题总结
题目的意思是要统计有多少个子数组能满足移除后剩下的元素为严格递增的关系,刚开始没考虑到移除的元素要是连续的,所以出错了。首先,我们可以先统计一下数组的最大前缀, 如果整个数组都是递增的,那么我们就不用再算其他情况了;对于这种两边都需要枚举讨论的题目,我们可以只枚举一边,然后判断另外一边的数值,所以我们选择枚举后缀,只要后缀满足往前递减的关系,我们就进行计算,我们先让最大递增前缀往回,直到连接处满足关系,然后此时答案就是最大前缀的下标加2,剩下的任务就是模仿这个过程完成循环,直到后缀不满足情况就结束。
2024-07-11 18:05:55
1120
原创 Actor-Critic 算法
Actor-Critic 算法通过结合策略梯度和价值评估,提供了一种高效、稳定的策略优化方法。它在处理复杂环境和大规模问题时表现出色。理解和实现 Actor-Critic 算法不仅能够帮助我们在强化学习领域中取得更好的成绩,还能为解决实际问题提供有力工具。
2024-07-10 13:54:30
411
原创 强化学习中的蒙特卡洛算法和时序差分算法
蒙特卡洛方法和时序差分方法各有优缺点,在不同的应用场景下可以互为补充。蒙特卡洛方法通过完全序列的回报估计状态值,适用于离线处理;时序差分方法通过每一步的即时回报和估计值更新状态值,适合在线学习和实时更新。在实际应用中,可以根据具体需求选择合适的方法,甚至可以结合使用,以达到最优的价值估计效果。
2024-07-10 13:46:51
853
原创 了解PPO算法(Proximal Policy Optimization)
PPO 算法通过引入裁剪机制和信赖域约束,限制了策略更新的幅度,提高了训练过程的稳定性和效率。其简单而有效的特性使其成为目前强化学习中最流行的算法之一。通过理解并实现 PPO 算法,可以更好地应用于各种强化学习任务,提升模型的性能。%5Cepsilon。
2024-07-09 20:54:09
783
原创 了解Adam和RMSprop优化算法
RMSprop和Adam都是深度学习中常用的优化算法,各自有其优势。RMSprop通过调整每个参数的学习率来处理非平稳目标,而Adam则结合了动量和均方根的思想,使得它在处理稀疏梯度和非平稳目标时表现优异。理解并灵活运用这些优化算法,将有助于提高模型训练的效率和效果。
2024-07-09 20:43:53
1123
原创 强化学习中的Double DQN、Dueling DQN和PER DQN算法详解及实战
Double DQN、Dueling DQN和优先经验回放DQN(PER DQN)都是对原始DQN的改进,各有其优点和适用场景。Double DQN通过减少过高估计提高了算法的稳定性;Dueling DQN通过分离状态价值和优势函数更好地评估状态;PER DQN通过优先采样重要经验加速了学习过程。这些改进算法在不同的应用场景下,可以选择合适的算法来提升强化学习的效果。
2024-07-07 15:35:10
899
原创 强化学习中的Q-Learning和Sarsa算法详解及实战
Q-Learning和Sarsa是两种经典的强化学习算法,各有优缺点。Q-Learning通过最大化未来的预期回报来更新Q值,具有更强的探索性;而Sarsa则使用实际执行的动作进行更新,更注重策略的稳定性。通过实际代码示例,我们可以看到这两种算法的实现和应用。根据不同的应用场景,可以选择适合的算法来解决实际问题。
2024-07-07 12:18:51
1191
原创 探索C++新特性:深入理解Lambda表达式
Lambda表达式是一种在代码中直接定义匿名函数对象(functors)的方法。它们可以捕获来自周围作用域的变量,并可以在需要函数对象的任何地方使用。// 函数体capture:捕获列表,用于指定在Lambda表达式中可以使用的外部变量。parameters:参数列表,类似于普通函数的参数列表。(可选):返回类型,可以省略,编译器会自动推断。:函数体,包含要执行的代码。
2024-07-06 15:03:04
775
原创 2024.7.6 刷题总结
如果没有,就放入,判断是否满足条件,如果不满足,再依次把六种可能的情况放入,分别是把 X 壶灌满,把 Y 壶灌满,把 X 壶倒空,把 Y 壶倒空,把 X 壶的水灌进 Y 壶,直至灌满或倒空,把 Y 壶的水灌进 X 壶,直至灌满或倒空。经过数学分析发现,只需要枚举数组的右端点,维护一个当前子数组值的变量,当前数和前一个数不一样时,我们就令子数组的元素个数+1,如果相同,我们就令变量重新为1,然后每次循环结束都把当前的值加到答案中,保证能计算到每个右端点代表的子数组的值。
2024-07-06 14:55:04
159
原创 2024.7.5 刷题总结
202.快乐数,这道题直接看就是通过判断一个数通过规则变换能不能最终回到1或者是进入无限循环,如果我们根据路线就可以得出是判断有没有环的题目,所以我们可以使用快慢指针的方法,若循环,即出现环时,快指针会追上慢指针。3033.修改矩阵,本题为简单模拟题,题意是找到每列的最大值,然后把值为-1的更换即可,所以我们需要遍历两次数组,第一次把不是-1的点写入并且维护列的最大值,第二次把-1的点用列最大值更换即可。
2024-07-05 14:17:54
174
原创 深度Q网络(DQN)算法技术博客
DQN算法通过结合Q学习与深度神经网络,解决了高维状态空间下的强化学习问题。本文详细介绍了DQN的基本原理、关键步骤和具体的代码实现,希望能够帮助读者更好地理解和应用这一算法。如果在实际应用中遇到问题,可以参考相关文献和开源代码库,进一步优化和改进。
2024-07-04 18:02:09
1203
原创 2024.7.4 刷题总结
3086.拾起k个1需要的最少行动次数,在这道题我们可以把0看成空位,第二种操作相当于把一个1移动到和它相邻的空位上,而第一种操作则是贪心地把和当前下标相邻的0变成1;maxchanges较小的情况是,几所所有长为k-maxchanges的子数组的货仓选址问题,再取最小值。通过设置一个当前遍历的元素个数和需要遍历的数组来维护dfs函数,维护一个当前的集合和答案集合,当个数达到原数组大小时返回,遍历时包含两种情况,分别是考虑当前元素和不考虑当前元素,每次都先达到了最大元素个数,再依次返回。
2024-07-04 17:53:48
180
原创 Linux 常用指令详解
Linux 是一个强大而灵活的操作系统,掌握常用的 Linux 指令是使用和管理 Linux 系统的基础。本文将介绍一些常用的 Linux 指令,并附上 Vim 和 g++ 的常用指令说明,帮助你更好地进行开发和操作。
2024-07-03 16:48:56
634
原创 Git 常用操作详解
Git 是一个功能强大且广泛使用的版本控制系统。掌握 Git 的基本操作是每个开发者必备的技能之一。本篇博客将介绍 Git 的一些常用操作,并通过一个完整的示例来引导你更好地理解这些操作。
2024-07-03 16:37:01
497
原创 2024.7.3 刷题总结
31.下一个排列,本道题考察的是双指针,题目的意思是找到下一个字典序更大的排列,所以我们的任务是把一个数组右边的一个较大数与数组左边的一个较小数交换,并且它们的距离应当尽量近,所以算法的步骤就是首先从后往前查找第一个顺序对,不满足降序的关系,标记为i.然后在i+1到n从后往前查找第一个下标j满足后数大于前数,然后交换两个数,并且将i+1到n之间的序列反转.3099.哈沙德数,简单数学题,我们的目的是计算出每一位数的和,所以我们每次取数模10的结果,然后令其除10,最后判断是否能整除即可。
2024-07-03 16:29:56
273
原创 2024.7.2 刷题总结
3115.质数的最大距离,本道题是一个简单的模拟题,题意是找到数组中第一个质数和最后一个质数,可以通过写一个质数筛来预处理标记质数再输出即可;由于本题的数据范围较小,所以我们只需要用最简单的指数判断方法即可,每个数都遍历到它的根号范围,然后分别通过正向和反向遍历找到第一个和最后一个质数,输出他们的下标差即可。1441.用栈操作构建数组,本题是一个简单模拟题,遍历n,当我们的目标数字在target中就只用Push,否则需要先Push再Pop,维护一个prev记录上一次操作时栈顶的索引值。
2024-07-02 14:13:21
396
原创 C++ STL 中哈希表的详细用法
C++ STL 中的和提供了强大的哈希表功能,能够高效地进行插入、删除和查找操作。理解其用法和注意事项,能够帮助我们在实际开发中更好地利用这些容器。
2024-07-01 21:21:55
882
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人