自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小泽爱刷题的博客

知行合一,克己复礼。

  • 博客(43)
  • 收藏
  • 关注

原创 回溯算法,hot100

选”:在循环中显式地将当前元素加入路径并继续递归。“不选”:通过递归和循环控制实现。在一次循环结束或跳过时,自然不选择该元素,转而选择后续的元素,这就相当于“不选”。语句意义适用场景检查变量是否为空(包括None和其他空值)判断是否有内容,常用于可迭代对象的处理检查变量是否严格等于None检查可选参数或函数返回值是否为None列表是对象: 列表在 Python 中是一个对象,拥有自己的内存地址。地址可用: 可以使用id()函数获取列表的内存地址,帮助理解其在内存中的存储情况。

2024-09-27 14:05:34 987 1

原创 HOT100,二叉树题解

依赖子树结果:当前节点的答案依赖于左右子树的计算结果,在左右子树处理完成后才能得到完整的信息。减少重复计算:后序遍历确保每个节点只被计算一次,避免重复计算。全局状态更新的正确性:在处理完所有子树信息之后更新全局状态,保证更新的准确性。例如,在二叉树直径问题中,后序位置可以确保我们计算的直径涵盖所有可能的路径。🤒后序位置的代码最强,不仅可以获取参数数据,还可以同时获取到左右子树通过函数返回值传递回来的数据。所以,某些情况下把代码移到后序位置效率最高;有些事情,只有后序位置的代码能做。

2024-09-24 13:14:17 625

原创 HOT100,28-35题

虽然 Python 列表和数组是不同的数据结构,但在许多情况下,Python 设计得足够灵活,允许列表像数组一样使用。对于大部分日常编程任务,列表已经可以胜任,但在对性能和数据类型有更高要求时,使用数组(如numpy)会更为合适。列表的一些常用操作,灵活使用这些足以灵活运用python解题!!!Python 列表(list)是一个非常灵活和强大的数据结构,支持多种操作和方法。heapq在处理元组时会按照元组的顺序逐个比较。对于,优先比较node.val,如果node.val相同,再比较i,以此类推。

2024-09-15 20:39:05 1082

原创 更换cuda版本

首先,删除现有的链接,可以使用rm:使用rm -rf命令会删除及其所有内容。确保这个链接是你要删除的,并且你不需要保留这个目录中的任何内容。然后,创建新的软链接,指向你想要的新路径这个命令将链接到。这样,所有指向的请求都会被重定向到。

2024-09-14 21:13:17 1460

原创 【无标题】

print(torch.version.cuda) # 检查 PyTorch 支持的 CUDA 版本print(torch.cuda.is_available()) # 检查是否能使用 GPU这三个术语指的是在使用 GPU 加速框架时涉及的不同组件。

2024-09-13 16:18:36 499

原创 leetcode18-27

将链表题目转换为数组来解决是可行的,并且在某些情况下可能更简单。但要注意额外的空间复杂度和可能的内存限制。如果链表非常大,直接在链表上操作可能更合适,以避免额外的内存开销。

2024-09-11 17:41:05 1737

原创 知行合一!

王阳明的“知行合一”理念要求我们将所学的知识和理念付诸实践,通过实际行动来体现内心的理解。做到“知行合一”,需要从内心接受理念,逐步实践,持续反省和调整,同时保持言行一致和真实性。例子:如果你学习了时间管理的理论,可以从每天的工作计划开始实践,逐步形成有效的时间管理习惯。调整:根据反省的结果,及时调整自己的行为,确保它们与内心的知识和理念保持一致。例子:观察和学习成功的领导者或优秀的团队成员,他们如何将他们的理念付诸实践。学习:在实践中,新的经验和反馈将不断丰富和完善你的知识。

2024-09-10 11:45:29 435

原创 pycharm调试知识, 线程进程与深度学习

多线程在深度学习中主要用于I/O 密集型任务,如数据加载和预处理,以防止数据成为训练过程中的瓶颈。多进程常用于克服 GIL 的限制,处理 CPU 密集型任务,以及在分布式训练中并行化模型训练。GPU 并行计算是深度学习的核心,主要负责大规模矩阵运算和模型训练,并行性是由 GPU 硬件架构提供的,而不是通过 Python 的多线程机制。因此,深度学习中多线程的应用主要集中在数据加载、推理服务和辅助任务,而核心计算则由 GPU 完成并行化处理。多进程。

2024-09-10 11:33:22 1784

原创 hot100,第10-15题 坚持

前缀和数组的长度为n + 1是因为它包括了从原始数组的起始位置到每个位置的和,以及一个额外的位置用于简化计算。这里的n是原始数组的长度。让我们详细解释一下这个设计。前缀和是一个数组的前缀和数组,其中每个元素表示从数组开始到当前位置的所有元素之和。前缀和数组prefix_sum局部最优:解决当前子问题的最优解。全局最优:所有子问题的最优解中最优的那个。动态规划通过结合局部最优解来逐步构建全局最优解。这种方法在许多优化问题中非常有效,特别是当问题具有最优子结构和重叠子问题的特性时。

2024-09-09 18:40:27 1331

原创 hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

详细讲解hot100

2024-09-07 16:33:59 1297

原创 dp子序列问题+时间复杂度分析

在动态规划中,选择的过程就是依据状态转移方程来进行的。状态转移方程告诉我们在当前状态下有可能的选择以及如何计算这些选择的结果。通过这样的选择,我们可以将复杂的问题拆解成更小的子问题,并通过这些子问题的解构建出原问题的解。子序列问题本身就相对子串、子数组更困难一些,因为前者是不连续的序列,而后两者是连续的,就算穷举你都不一定会,更别说求解相关的算法问题了。子序列是不连续的,而子串,子数组都是连续的序列。一般来说,这类问题都是让你求一个最长子序列,因为最短子序列就是一个字符嘛,没啥可问的。

2024-09-05 19:48:40 1285

原创 动态规划,dp函数与dp数组,优先掌握dp函数法

memo数组是用来记录dp函数的计算结果的存储结构,它将动态规划中子问题的解缓存起来,以提高算法效率。你可以认为memo数组的每个元素对应于dp函数在某个位置的返回值,而dp函数通过检查memo来决定是否需要进行计算。这样理解下来,memo数组和dp函数的作用是协同的,但memo是静态存储,而dp是动态计算,它们共同构成了记忆化递归的核心机制。139. 单词拆分labuladong 题解思路memo = []

2024-09-05 13:01:53 1534

原创 深度学习dataset等概念

反向传播是深度学习模型训练的核心步骤之一,它通过计算损失函数相对于模型参数的梯度,来更新这些参数。是 Python 的内置函数,用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。函数会自动更新模型参数。具体来说,它会遍历所有参数,并使用优化器的更新规则(如SGD的权重衰减、Adam的梯度平方平均等)来更新每个参数。这段代码的用途是在训练深度学习模型时,通过反向传播和优化步骤,逐步调整模型参数,以最小化损失函数,从而提高模型的预测性能。

2024-09-03 18:02:03 1533

原创 召回率和准确率理解

召回率衡量的是实际为正类的样本中被正确识别为正类的比例。

2024-09-03 11:58:25 2937

原创 二分查找精炼回顾-kevin

二分查找总结,统一采用闭区间思考。 包含区间查找

2024-09-02 23:01:03 940

原创 回溯算法回顾

浅拷贝:创建一个新对象,但不递归复制子对象。换句话说,浅拷贝只复制了对象的引用,而不是实际的对象本身。对于不可变对象(如整数、字符串、元组),浅拷贝和深拷贝效果相同,因为不可变对象在 Python 中不能被修改。深拷贝:创建一个新对象,并递归复制所有的子对象。这样,即使子对象本身是一个可变对象,也会被独立复制,确保新对象和原对象完全独立。遇到回溯问题的时候要思考深拷贝还是浅拷贝问题,如果是碰到浅拷贝,赋值过去的只是引用,那么回溯之后最后加入res中的答案都是一样的!!不可变对象。

2024-09-02 19:56:18 988

原创 深度学习实践的一些基本概念

自动调用forward函数是 PyTorch 设计的一个关键特性,它提供了封装性、灵活性、一致性,并支持动态计算图,从而简化了神经网络模型的实现和使用。这种设计使得 PyTorch 成为一个强大且易于使用的深度学习框架。pytorch中,loss内也包括forward函数在 PyTorch 中,损失函数通常是用来计算模型预测值与真实值之间的差距,它本质上是一个计算过程。在自定义损失函数时,将其写成一个类并实现forward方法是为了遵循 PyTorch 的模块化设计和通用操作模式。写forward。

2024-09-02 15:05:04 1186

原创 pycharm快捷键

alt + shift + ↓ 向下拉取当前行, ctrl + shift + ↓ 将整个方法下移。ctrl + = 展开代码区域 ctrl + shift + - 收起文件中的所有区域。ctrl + w 选择文本光标处的单词, ctrl + shift + w 撤销选择。ctrl + alt + shift + j 选择文件中的所有匹配项 , 可以修改值。ctrl + d 复制光标所在的行 CTRL + Y 删除当前行。ctrl + f8给当前行设置断电。ctrl + 斜杠 注释行。

2024-09-02 13:07:03 528

原创 深度学习(二)

CUDA是一种并行计算的编程模型,提供了开发者利用GPU的工具和接口,适用于各种需要并行处理的应用程序。CuDNN是一个专门的加速库,建立在CUDA的基础上,针对深度学习中的神经网络操作进行了专门的优化,从而大幅提升计算效率。两者的结合,使得深度学习和其他计算密集型任务在GPU上能够以更快的速度、更高的效率完成Dataset:继承Dataset可以让你自定义如何获取和处理数据。这在处理复杂的数据集时非常有用,例如当数据需要从多个文件加载、进行特殊的预处理或处理非标准格式的数据时。DataLoader。

2024-08-31 23:09:33 2099

原创 bfs理解加深,bfs多用来求最小xx问题

因此,当你需要对字符串的某个字符进行修改时,必须先将字符串转换成一个可变的数据结构,比如列表,进行修改后再转换回字符串。base case写在开头,不写在递归里面,把能提到函数开头的判断逻辑都提到函数开头,因为递归部分是填写前中后序代码的位置,尽量不要和 base case 的逻辑混到一起,否则容易混乱。函数为啥会有返回值呢?回溯问题,关注树枝,也就是track这一点,例如经典的排列、组合问题,在穷举排列组合的时候,就是在树枝位置做选择(往。set具有的特性,无序性,唯一性, Python 中的。

2024-08-30 15:02:23 833

原创 深度学习(一)

的主要思想是在每一层的训练过程中,对其输入进行规范化,即将输入的分布调整为均值为 0 和方差为 1 的标准正态分布。具体来说,Batch Norm 在每个 mini-batch 上计算当前层输入的均值和方差,并使用这些统计量来规范化数据。Batch Normalization 是一种通过对每层输入进行规范化来提高模型训练速度和稳定性的技术。它通过减少内部协变量偏移、提高训练稳定性、减少对初始化的依赖,并具有一定的正则化效果,从而使得深度学习模型在训练过程中表现更好。

2024-08-29 20:05:51 1690

原创 回溯算法解决组合排列问题

在许多组合问题中,解空间(所有可能的解组合)可能非常庞大,而其中只有一部分是有效的或符合要求的解。剪枝的目的是在搜索的过程中,识别并跳过那些不可能产生有效解的分支。例如,在回溯算法中,每次选择一个选项(即进入一个分支),再继续尝试下一个选项。但在某些情况下,你可以通过提前判断,发现某个分支已经不能满足条件,那么就可以直接放弃这个分支的进一步探索,这就是剪枝。剪枝操作通过智能地减少算法的搜索空间,显著提升了算法的效率和执行速度。在处理组合问题、搜索问题时,剪枝往往是不可或缺的优化手段。

2024-08-29 16:25:29 1248

原创 回溯算法入门

回溯算法是一种暴力搜索算法,用于在决策树中搜索所有可能的解,适用于求解组合、排列、子集等问题。回溯算法通过递归方式尝试所有可能的路径,当发现某条路径不满足条件时,回溯到上一层并尝试其他路径。

2024-08-29 12:02:15 1204

原创 动态规划,入门

memo在自顶向下的方法中保存了子问题的解,避免重复计算。dp table在自底向上的方法中通过逐步计算填充得到问题的解。尽管它们的使用方式不同,但它们的本质都是用于存储子问题的结果,因此它们本质上是相同的工具,可以互换称为dp table。dp[0] = 0for i in range(len(dp)): #这里i代表这个amount, dp[i]代表i这个amount得到的答案continue解法二,自底向下,迭代解决。

2024-08-28 14:38:40 1021

原创 二叉树bst

下面我们详细解释一下为什么后序遍历位置可以实现这种高效的剪枝 在整个过程中,我们每次处理节点时,都能确保它的左右子树已经处理完毕,这样我们可以根据子树的结果决定是否剪掉当前节点。这种遍历方式意味着我们在处理一个节点时,已经处理并得到它的左右子树的结果。“自底向上”的处理方式指的是在后序遍历过程中,我们在处理一个节点时,已经处理并完成了其所有子节点的操作。这种自底向上的处理方式确保了我们在处理每个节点时,已经拥有了其左右子树的所有信息,可以直接进行计算,而不需要重复访问子树,从而提高了效率。

2024-08-07 22:14:21 582

原创 二叉树刷题,bfs刷题

实例方法使用self来访问和修改实例属性和方法。类方法使用cls来访问类属性和方法。静态方法不需要self或cls参数,因为它们不访问类或实例的任何属性或方法。访问实例方法需要使用self,这并不是类方法的特性,而是实例方法的特性。类方法和静态方法不使用self,类方法使用cls,静态方法不使用任何特殊的类或实例引用实例方法: 实例方法可以访问实例属性和类属性。它们主要用于操作实例数据。python复制代码class MyClass:类方法: 类方法只能访问类属性,不能直接访问实例属性。

2024-08-06 23:26:22 1082

原创 二叉树遍历分解问题+遍历的思路

本篇所有题目先用分解问题思路解决,再用遍历思路解决**方法一,分解问题的思路. 分解成左子树是否能满足target - root.val 或者右子树是否能满足target - root.val 再详细考虑base case **在递归函数中,基线条件(base case)是用于停止递归的条件,这里有两个base caseFalseTrue。

2024-08-05 17:32:41 587

原创 二叉树递归解决问题刷题 (一)

遇到和深度相关的题目,可以用dfs递归遍历深度获取bfs结果来做513. 找树左下角的值如何找二叉树最底层最左边节点的值呢,就是dfs遍历深度,来获取,最后一层的第一个元素就是。分解问题的思路解决二叉树回顾确定问题的性质:首先,你需要明确你要解决的问题是什么。例如,是要查找某个值,还是要遍历整棵树,或者是计算某个特定属性(如深度或节点数)?找到基本情况(Base Case):这是递归的停止条件。对于二叉树来说,基本情况通常是树为空(即节点为 )。在这种情况下,你可以直接返回结果(例如,对于查找值的问题,

2024-08-05 15:01:21 1248

原创 二叉树递归遍历解决问题刷题 (二)

1.如果让你在二叉树的「树枝」上做文章,那么用遍历的思维模式解题是比较自然的想法 可以是求和问题也可以是路径问题,路径问题可以理解为回溯两次,在叶子结点那里的回溯,是把记录的一个叶子节点删除某些节点符合一些特质,找到这些符合特质的节点,用递归遍历的思想来写左叶子就是某些结点在这道题目中,我们需要计算二叉树中所有左叶子节点的和。因为我们只是需要遍历整棵树,并累加所有左叶子节点的值,而不需要修改或恢复树的状态,所以不需要回溯。

2024-08-04 22:30:32 986

原创 二叉树递归遍历解决问题刷题 (一)

在遍历完左子树和右子树后,需要将当前节点从路径中移除。这是为了确保在回溯到上一个节点时,路径是正确的。例如,当从2回溯到1时,路径应该从'12'变为'1',而不是'12'。python复制代码这行代码在每次递归调用结束后,移除路径中的最后一个字符,保证路径能够正确回溯到父节点。总结来说,回溯时移除路径中的最后一个字符是必要的,以确保路径在遍历和回溯过程中始终正确。搞清楚回溯几次还是很有必要的,草稿本上理一理。反正最多也就是两个地方回溯。# 遍历一遍二叉树就能出结果# 二叉树遍历函数。

2024-08-03 23:21:42 1363

原创 二叉树(三),半知半解救

这种“分解问题”的思路,即递归思想,核心在于对递归函数的定义。通过对函数的定义,解释代码的逻辑,并验证其正确性。来计算结果,而用分解问题思路解题时函数名根据该函数具体功能而定,而且一般会有返回值,返回值是子问题的计算结果。「分解问题」这一模式,关键在于明确递归函数的定义,然后利用这个定义,来构造函数,而具体如何完成的可能比较模糊。,而在 [动态规划核心框架] 中给出的函数签名是带有返回值的。「遍历」这一思维模式,只要运用二叉树的递归遍历框架即可。中给出的函数签名一般也是没有返回值的。二、用分解问题的方法。

2024-07-24 20:03:26 386

原创 动态规划定义

通俗地说,动态规划就是通过记住已经解决的子问题的答案,从而避免重复计算,从而加速问题的解决。动态规划问题本质上是通过聪明地穷举来优化问题的求解过程。通过列出状态转移方程和使用空间换时间的思路,你可以有效地解决许多复杂问题。动态规划的核心思想就是把一个大问题分解成许多小问题,通过记录小问题的解来避免重复计算,从而高效地解决大问题。动态规划通过“记住过去”的方式,让计算机能更聪明地穷举,从而高效解决问题。穷举所有可能性:通过状态转移方程描述问题的递归关系。定义状态:确定问题的状态和状态变量。

2024-07-22 20:20:46 655

原创 二叉树纲领篇(模模糊糊)

如果可以,写出这个递归函数的定义,并充分利用这个函数的返回值。

2024-07-22 20:02:09 1398

原创 链表(二) 找链表倒数第k个结点(详细文字推导) + 链表环(详细通俗思路)

三、综上两点,思路清晰,让第一个结点走k步,走到第k步的时候设置第二个结点, 当第一个结点走到null,这时候第2个结点走了n - k 步,也就是走到了整数第n - k + 1个 结点,也就是找到了倒数第k个结点。解体思路:快慢指针都从起始点开始走,假设走了k步相遇,也就是慢指针走的距离是k,快指针走的距离是2k假设 慢指针当前位置,也就是快慢指针相遇位置距离结点起点距离为m, 那么抓住关键点。当链表长度为奇数时候,假设n = 5 走到中间结点需要走2步,也就是整数第3个,此时快指针在最后一个结点。

2024-07-21 23:54:26 1727

原创 链表概念的理解

导入了heapq模块,它是Python标准库的一部分,提供了堆队列算法的实现,也就是我们常说的优先队列。在 Python 中,对象变量实际上是对象的引用或指针。当你创建一个对象并将其赋值给一个变量时,这个变量实际上存储的是对象的内存地址。通过这个变量,你可以访问和操作对象的属性和方法。:在 Python 中,变量存储的是对象的引用或内存地址,通过这些引用我们可以访问和操作对象。:在Python中,赋值操作将对象的引用(内存地址)赋给变量,而不是对象本身。的属性和方法,因为它们引用的是同一个对象。

2024-07-20 23:15:24 380

原创 数组技巧分为快慢指针和左右指针两种技巧

leetcode283 移动零。

2024-07-19 17:02:35 535

原创 leetcode 二分查找,找数字最基础,找左右边界要多考虑细节

当二分查找都用闭区间的时候,也就是初始化的时候,左闭右闭的时候,更新左右的时候都要带上1,也就是找左侧边界为什么相等时还要收紧的解释:收紧右侧边界:当nums[mid] == target时,即当前中间元素等于目标值,这时不能立即返回mid作为结果。因为可能存在更左侧的相同元素。为了找到最左侧的索引,需要将搜索区间的右侧边界向左移动,即调整为right = mid。这样做可以继续在更左侧的区域搜索,直到找到最左侧的索引。也就是因为我们初始化 right = nums.length - 1 所以决定了我们的「

2024-07-19 00:17:38 485

原创 滑动窗口模板 解题关键在确定何时收缩窗口

为什么要「左闭右开」区间–方便处理边界条件 滑动窗口也是数组指针的技巧之一, 是快慢指针技巧分支里面的一个。。因为这样初始化时区间[0, 0)中没有元素,但只要让right向右移动(扩大)一位,区间[0, 1)就包含一个元素0了。如果你设置为两端都开的区间,那么让right向右移动一位后开区间(0, 1)仍然没有元素;如果你设置为两端都闭的区间,那么初始区间[0, 0]就包含了一个元素。这两种情况都会给边界处理带来不必要的麻烦。

2024-07-18 17:22:04 639

原创 数组快慢指针运用,个人总结,python

*在数组中并没有真正意义上的指针,但我们可以把索引当做数组中的指针,这样也可以在数组中施展双指针技巧,。,这是数字题目运用快慢指针技巧的题眼特征。

2024-07-16 19:05:00 334

原创 leetcode 数组

前k个元素都是不等于val的元素, 确保了前slow个元素都不是val,所以最后返回也就返回slow。先把螺旋矩阵放一放,会者不难,难者不会。学习规划:先代码随想录 后labuladong巩固。使用 while 来重复执行代码直到某个条件不再满足。== 也就是判断什么时候起始位置应该移动。使用 if 来基于条件执行一次性的决策。

2024-07-16 14:48:37 470

空空如也

空空如也

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

TA关注的人

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