- 博客(52)
- 资源 (4)
- 收藏
- 关注
原创 自定义前向与反向传播:torch.autograd.Function
PyTorch 的核心自动求导工具使用了一种基于动态计算图的机制。当你在Tensor上调用操作时,PyTorch 会根据这些操作动态地构建一个有向无环图(DAG)。在这个图中,叶子节点表示输入张量,根节点则是输出张量。每个节点都表示一个操作,而autograd通过从根节点回溯(backpropagation),逐步计算各个节点的梯度。PyTorch 自动求导的强大之处在于其动态计算图构建方式。在前向传播期间,每当执行一次操作,PyTorch 就会创建相应的计算图,并允许你通过backward()
2024-09-17 17:37:13
1143
原创 【2024】LeetCode HOT 100——图论
这里以DFS为例,DFS不需要开方向数组,不需要队列,实现更为简洁。经典的Flood Fill算法,可BFS也可DFS。如果仿照C++,用列表实现,实际运行效率会很低。为先修课程的要求数。
2024-06-29 16:42:54
625
原创 【2024】LeetCode HOT 100——回溯
时我们便得到了一个答案。个右括号组成的所有括号序列中,合法的括号序列有。因为共有卡塔兰数个方案,且构造每个方案需要。是否是回文串,这样就可以在回溯的过程中以。一个括号序列是合法的当且仅当它满足以下条件。而所有的括号序列共有。数组(布尔数组),它代表。为所有可行解的长度之和。是三个字母的数字个数,是四个字母的数字个数。的时间,故时间复杂度为。我们可以预处理出来一个。
2024-06-29 14:37:18
519
原创 【2024】LeetCode HOT 100——堆&栈
最大堆存储较小的一半元素,最小堆存储较大的一半元素。最大堆的堆顶是较小一半元素的最大值,最小堆的堆顶是较大一半元素的最小值。:如果最大堆的元素个数比最小堆多超过1个,则将最大堆的堆顶元素移到最小堆。如果最小堆的元素个数比最大堆多,则将最小堆的堆顶元素移到最大堆。:如果总元素个数为奇数,中位数为最大堆的堆顶。如果总元素个数为偶数,中位数为最大堆的堆顶与最小堆的堆顶的平均值。:如果新元素小于或等于最大堆的堆顶,将其插入最大堆。否则,将其插入最小堆。,我们可以借助计数排序的思想,将其降低至。
2024-06-27 16:50:35
288
原创 【2024】LeetCode HOT 100——贪心算法
出发能够到达的最远位置(可以理解为不断拓展右边界),如果。因此,时间复杂度是与价格数组的长度。),不依赖于输入大小。所需的额外空间是常量级别的。首先可以证明,能够跳到的位置一定是。代码只使用了几个额外的变量 (代码中的循环遍历了价格数组。和上一题一样,只不过本题是求。(题目保证可以跳到最后)。我们可以设置两个指针,(可用反证法证明)。
2024-06-26 12:06:40
311
原创 【2024】LeetCode HOT 100——技巧
这样的升序对,说明整个序列都是降序的,直接翻转该序列即可。之外每个节点都有一条入边,这意味着图中一定有环。这道题是「荷兰国旗问题」,我们需要维护三个指针。,首先从后往前找到第一个升序的元素对,记为。仍是降序的,我们让这一段变为升序的即可。,说明每个节点都有一条出边,且除了。向左移动,任一时刻,需要满足,重复了不止一次,说明节点。,那么数组的下标范围是从。的入边至少有两条,即。
2024-05-29 17:39:51
366
1
原创 【2024】LeetCode HOT 100——多维动态规划
我们可以枚举回文串的中心,然后从中心开始向两边扩展,并不断更新最大值。回文子串有两种类型,一种是偶数长度的,一种是奇数长度的。枚举中心的时候要同时考虑两种类型的回文串。的最少步数,我们只关注如何从。的最长公共子序列的长度。
2024-05-27 19:38:01
235
原创 【2024】LeetCode HOT 100——动态规划
如果只有一间房屋,则偷窃该房屋,可以偷窃到最高总金额。如果只有两间房屋,则由于两间房屋相邻,不能同时偷窃,只能偷窃其中的一间房屋,因此选择其中金额较高的房屋进行偷窃,可以偷窃到最高总金额。这道题的第一想法可能使用贪心来做,但贪心是会失败的,来看这样一个示例:硬币数组。在两个选项中选择偷窃总金额较大的选项,该选项对应的偷窃总金额即为前。但要注意的是,这是一个只涉及体积,不涉及价值的背包问题。结尾的最长有效括号的长度。的所有子串中,只有它本身是字典中的单词,故取。结尾的最长递增子序列的长度,那么本题答案为。
2024-05-26 17:30:19
253
原创 【2024】LeetCode HOT 100——二叉树
的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。首先我们需要了解什么是二叉树的中序遍历:按照访问。
2024-04-09 14:29:07
220
原创 【2023】LeetCode HOT 100——矩阵
分别代表右、下、左、上四个方向。每次碰壁或者遇到已经走过的地方,我们需要将方向顺时针旋转。等价于先将图像沿主对角线翻转,然后再图像水平翻转。如果将本题改为逆时针,则。使用方向数组即可实现。
2023-08-27 14:23:12
803
原创 【2023】LeetCode HOT 100——普通数组
统计左边的数出现的频率可以用一个哈希表来完成,而对于右边的数,我们可以在一开始初始化一个大的哈希表,然后在枚举的时候减去相应的频率即可。注意,由于遍历到当前区间时至多保存上一个区间,因此遍历结束后最后一个区间不会得到保存,所以我们需要手动保存最后一个区间。的比较,所以排序实际上是先按照第一个元素排序,再按照第二个元素,以此类推。本题和本文的第一题十分相似,只不过第一题只有一个区间,而本题有两个区间。为结尾的连续子数组的最大和,记为。区间内的连续子数组的最大和,记为。区间内的连续子数组的最大和,记为。
2023-08-25 18:57:18
454
原创 【2023】LeetCode HOT 100——滑动窗口&子串
的滑动窗口并用哈希表统计这个窗口内的字符频率。在证明了双指针的单调性后,我们就可以使用它了。中的字符频率,一个哈希表用来统计滑动窗口中字符的频率。谈到子数组的和,就可以联想到区间和,而求区间和通常会用到前缀和算法。变量,用来跟踪当前窗口中包含了多少个满足条件的目标字符(即字符串。为右端点的无重复字符的最长子串的左端点,那么按照之前的思路,当。我们枚举子串的右端点。时,如果出现了重复的字符,那么重复的字符必然是。中字符的数量时,表示当前窗口中已经包含了字符串。为右端点的无重复字符的最长子串的左端点,矛盾!
2023-08-24 15:58:22
667
原创 【2023】LeetCode HOT 100——双指针
我们可以预处理出前缀最大数组(类似于前缀和数组)和后缀最大数组,这样就可以在。按照「三数之和」的思路,我们会首先对原数组从小到大进行排序,然后枚举第一个数。由于数组是有序的,那么相同的数字必然相邻,因此如果。,那么后两个条件会自动满足,我们只需要确保第一个条件。可以发现,无论移动哪一个指针,并不是和的形式,我们无法使用相向双指针进行处理。思路与三数之和一致,但要注意溢出的情况,需要开。先不考虑重复的问题,首先对原数组排个序,那么。是求和的形式,因此可以使用相向双指针。,那么这两个指针形成的容器的储水量为。
2023-08-20 14:28:14
436
原创 【2023】LeetCode HOT 100——哈希
注意到字母异位词按照字典序排列后等于原单词,因此我们可以以原单词为键来记录该单词衍生出的所有字母异位词。」有异曲同工之妙,都是在枚举一个数的同时统计该数左边的情况。的时间内完成,所以我们不能对原数组进行排序。即可,这可以用一个哈希表来记录。为起点的最长连续序列的长度为。考虑枚举数组中的每个数。,以它为起点,尝试匹配。个字符串的最大长度。
2023-08-19 01:11:55
386
原创 LeetCode 786. 第 K 个最小的素数分数
个“链表”的表头加入到优先队列中,后续看哪一个链表的表头被弹出,就向优先队列中加入该链表的下一个“节点”。于是我们可以像「合并K个有序链表」那样找到第。个“链表”全部构造出来,花费的时间就已经是。这里有一个巧妙的做法,我们一开始只把。次后,优先队列的队头就是最终的答案。因为用到了排序,所以时间复杂度是。本题还有更优雅的解法,复杂度为。这里有一个小细节,我们在判断。,这样不会引入浮点数的误差。注意,如果我们一开始就把。的时候可以将其转化成。中选,因此我们可以将。
2023-08-18 21:19:19
321
原创 【2023】字节跳动 10 日心动计划——第十关
AVL树的定义是递归的,即一个树是AVL树当且仅当根节点的左右子树都是AVL树且两者高度差不超过1。注意细节,路径必须是从根节点到叶子结点。
2023-08-18 19:58:07
300
原创 【2023】字节跳动 10 日心动计划——第九关
题目中规定了同一个字符不能出现在多个区间中,因此对于一个字符而言,如果它包含于某个区间,那么这个区间应当包含所有这样的字符。我们依次枚举该区间的每一个字符,并用字符最后一次出现的下标来更新区间的右端点,这样一来,我们就可以得到不可分割的第一个区间。回到本题,为了避免重复,我们同样可以先对数组排个序以确保相同的数字相邻,然后枚举每个位置,对于每个位置,枚举这个位置上对应的数可能出现的次数,即。回顾全排列 II,我们的枚举思路和全排列 I相同,但是为了避免重复,我们固定了相同数字的相对位置。
2023-08-13 16:00:17
268
原创 【2023】字节跳动 10 日心动计划——第八关
式在形式上是完全一致的,无非是嵌套的括号数量不一致。代表Python中的字符串乘法)就达到了“去括号”的目的。将链表从中间一分为二,再将后半部分翻转,最后对两个链表进行二路归并即可。那么最内层的括号中一定只含有字母,由于左括号左边一定紧跟数字,所以。由于是循环数组,我们可以先将两个原数组拼接在一起,然后再应用单调栈。的时候,就可以继续执行同样的操作来达到“去括号”的目的。一定是最内层的括号,此时我们需要去掉最内层的括号,让。我们从左向右扫描整个字符串,遇到的第一个。为0,从左向右扫描时不断累加,遇到。
2023-08-13 16:00:03
299
原创 【2023】字节跳动 10 日心动计划——第七关
因为对于全排列问题,当前位置的所有状态和数组长度有关,所以我们只能通过for循环来实现。而对于子集问题,当前位置的状态只有两种,因此不必使用for循环,直接展开即可。类似地,对于子集问题,我们同样要遍历当前位置的所有状态,即选当前位置的数或者不选。个位置(当前位置)上的所有状态(假设前。的递归搜索树,我们要在dfs函数里。我们可以举一反三,生成一个长度为。对于递归,则是dfs暴搜一下。轮的时候,我们会漏掉最终的。对于迭代,假设序列的长度为。,我们可以用一串长度为。串,即每个位置要么是。
2023-08-06 14:43:58
520
原创 【2023】字节跳动 10 日心动计划——第六关
注意到数组是有序的,因此我们可以用二分去处理,时间复杂度可以降至。,前者不满足这个条件,后者满足这个条件,所以我们可以套用。既然要用二分,那我们就需要找到一个性质能够将区间。是偶数,且数组的长度是奇数,不妨设为。的左右两边各有偶数个元素,从而。不妨设只出现一次的元素的下标是。是否相等,如果相等,则。是否相等,如果相等,则。,从而我们只需要判断。
2023-08-05 21:01:11
975
1
原创 【2023】字节跳动 10 日心动计划——第五关
求有多少个和为K的子数组即求有多少个区间和等于K(注意子数组和子序列不一样,子序列可以是不连续的),而提到区间和就应当想到前缀和。在输入序列中不一定相邻,所以我们要在一开始对输入序列排个序,这样一来,相同的数字就会相邻。字符串的全排列和数字序列的全排列本质是相同的,我们先回顾一下两道数字全排列的题目。在dfs的过程中,我们是从左往右依次填入数字的,在填某一个位置的时候,能够填。本题是典型的dfs,但有一个细节就是,返回的结果不能包含重复的元素。,为方便观察,我们给相同的数字赋予不同的下标,即。
2023-08-05 17:06:02
462
原创 【2023】字节跳动 10 日心动计划——第四关
天卖出股票可获得最大利润,那么买入股票必然是在前。更进一步,买入股票应当是第。家能够获得的最大金额,那么我们可以按照第。此外,还可以使用滚动数组将空间复杂度优化至。间房屋,那么剩下可以偷窃的范围就是。间房屋,那么剩下可以偷窃的范围就是。天卖出股票能够获得的最大利润。取两者中的最大值就是本题答案。这说明我们可以维护一个。先回顾第一代的打家劫舍。
2023-08-04 23:21:06
286
原创 【2023】字节跳动 10 日心动计划——第三关
具体来讲,我们始终保持栈底元素为当前已经遍历过的元素中「最后一个没有被匹配的右括号的下标」,这样的做法主要是考虑了边界条件的处理,栈里其他元素维护左括号的下标。之前我们是让两个指针从中间往两边移动,这次我们让两个指针从两边往中间移动,所以填答案的时候需要倒着填。判断栈是否为空,如果栈为空,说明当前的右括号为没有被匹配的右括号,将其压入栈中,否则,更新答案。注意,任何时刻,只有栈底元素是右括号的下标,其他元素都是左括号的下标!方法一:找到正负元素的分界线,然后对正、负数组进行二路归并。,则将其下标压入栈中;
2023-08-04 20:59:12
668
原创 【2023】字节跳动 10 日心动计划——第二关
的形式,但其中有若干个位置上的数是错误的,每一个错误的位置就代表了一个缺失的正数。,由此可知缺失的数是2。恢复后,数组应当具有。
2023-07-21 23:04:14
337
原创 【2023】字节跳动 10 日心动计划——第一关
看到前缀应当想到,我们可以将dictionary中的每个单词都插入到前缀树中,然后扫描sentence中的每个单词看是否需要进行替换。
2023-07-18 10:14:47
512
原创 深度学习常见模型大小汇总(持续更新...)
本篇博客将记录深度学习领域常见模型的大小,具体算法如下模型可能来自于PyTorch官方,HuggingFace等。如有错误或者建议欢迎在评论区指出。第三方库版本4.30.2PyTorch2.0.1。
2023-07-09 21:42:16
1752
原创 邻接矩阵的COO格式
我们知道,邻接矩阵通常是稀疏矩阵,而COO格式(CoordinateFormat)是稀疏矩阵的一种存储方式,本文将简要介绍如何将无权无向图的邻接矩阵转化为COO格式。顾名思义,COO格式即坐标格式,我们只需考虑邻接矩阵中不为零的元素的坐标。对于无权无向图,其邻接矩阵是对称阵并且元素非。先考虑下三角部分,不为零的元素的坐标为。,因此所有不为零的元素的坐标为。............
2022-07-26 11:56:21
1287
IMDb-Large Movie Review Dataset
2022-10-28
常见英文单词数据集(NLP)
2022-06-23
PyTorch CNN 训练/测试/绘图 模块
2022-05-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人