- 博客(52)
- 收藏
- 关注
原创 从零开始的LeetCode刷题日记:454. 四数相加 II
本题的思路其实很清晰,我们将四个数组分为两个部分。第一个部分两个数组所有和的情况直接存进去map当中作为索引(key),并记录出现次数。然后第二部分就直接查找有没有索引的相反数,有的话取出对应的value加到返回值上即可。这道题是使用std::unordered_map的一道题。原因一是不需要排序,但需要元素唯一。原因二是需要快速找到已经存在的值且要求得到这个值的个数,因此需要结构。
2024-04-11 15:07:02
447
原创 从零开始的LeetCode刷题日记:1. 两数之和
这道题是一道使用std::unordered_map。原因有两个,其一是我们需要快速找到遍历过的数,因此选择哈希法。其二是我们不但要找到这两个数,还要返回他们的下标,因此需要使用当key-value结构。
2024-04-11 14:58:46
284
1
原创 从零开始的LeetCode刷题日记:202. 快乐数
这道题是一道使用unordered_set的题目。这道题的核心就是要快速判断是否出现了无限循环,即出现了重复的数字。所以很适合用哈希解决,而且他要求唯一和不要求排序。
2024-04-11 14:51:01
243
原创 从零开始的LeetCode刷题日记:459.重复的子字符串
这道题目有着不用排序且元素唯一的特点,因此我们选择使用unordered_set来解决。我们利用其中一个num1创建一个unordered_set,然后用num2来逐个查询就可以了,最后的结果也存储在一个unordered_set中。
2024-04-11 14:44:55
213
2
原创 从零开始的LeetCode刷题日记:242. 有效的字母异位词
这是一道很简单的哈希表的题目,因为只涉及了26个字母的映射,所以完全可以用数组来解决。
2024-04-11 14:33:57
208
1
原创 从零开始的LeetCode刷题日记:459.重复的子字符串
题目,使用了移动匹配的思想。大致思想就是如果前面的子串和后面的子串是相同组成的,那么将这两者拼起来,头字符串的后半子串和尾字符串的前半子串仍然可以拼出一个新的对应字符串。注意掐头去尾,否则会找到字符串本身。
2024-04-11 14:11:19
239
原创 从零开始的LeetCode刷题日记:28. 实现 strStr()
答:第一个解释是根据不变量原则,本质上求next数组也是一个小的查找子串的问题,因此和整个KMP所解决的问题是一致的,和KMP的流程是一样的。第二个解释是回退的本质是不断缩小前后缀长度的一个不断妥协的过程,这个过程我们可以逐个逐个向前回退来比较,但next数组记录了能够匹配的前缀位置,那么只需要让i所指字符和这些匹配了的前缀末尾来比较就可以确定next[i]了。
2024-04-11 12:14:18
417
原创 从零开始的LeetCode刷题日记:右旋字符串
相似,我们只需要将字符串分为两个单词,然后分别进行翻转操作就行了。首先将整个字符串翻转,然后依次翻转两个子字符串就行。题目,思路其实很简单。
2024-04-10 22:37:36
214
原创 从零开始的LeetCode刷题日记:151.翻转字符串里的单词
这是一道经典的字符串题目,这里需要我们做两件事:第一是要删除多余的空格,第二是要逐个翻转单词。删除多余的空格可以通过快慢指针实现,当遇到非空格字符时手动加空格作为新单词的开头并连续遍历直到读完这个单词为止,在此之后移动慢指针到快指针前一位即可。逐个翻转单词的重点是找到每个单词后的空格,依然是通过快慢指针解决。
2024-04-10 22:21:49
298
原创 黑马程序员:C++核心编程——4.类和对象
封装、继承、多态class和struct的唯一区别:默认访问权限不同。class默认是private,struct默认是public。
2024-03-24 18:45:14
1100
原创 黑马程序员:C++核心编程——1.内存分区模型
主要内容是回顾C++的知识,并记录笔记。核心编程内容主要针对面向对象编程技术。其中,:代码区和全局区。产生了堆区和栈区存储。
2024-03-18 17:55:43
483
原创 从零开始的LeetCode刷题日记:替换数字
这道题是一道字符串题目,需要使用到双指针来解决。主要的思想是统计数字个数一次性扩充好字符串大小,然后按照原字符串从后往前读取,并按照读取到的内容来从后往前填充新的字符串。
2024-03-17 22:48:35
150
原创 从零开始的LeetCode刷题日记:541. 反转字符串II
这道题是一道字符串题目,关键点是使用reverse函数进行翻转。思路就是每次往前读取2k大小的字符串,然后判断读取情况并按题设翻转字符串即可。
2024-03-17 22:45:19
160
原创 从零开始的LeetCode刷题日记:142.环形链表II
即(x + y) * 2 = x + y + n (y + z),由此整理可知:x = (n - 1) (y + z) + z。其实意思就是如果要在入口处相遇,slow走过的x的长度就是fast在他们第一步在环内相遇点出发走了n-1圈后的长度,z就是他们第一步相遇后离入口的距离。这道题要分两步进行,第一步是判断链表有没有环,这个只要让快慢指针同时从head出发,但fast每次走两步,slow每次走一步,最后如果fast能与slow相遇,那自然是有环链表,反之无环。
2024-03-08 17:05:34
170
原创 从零开始的LeetCode刷题日记:面试题 02.07. 链表相交
这道题是一道链表题,不涉及对结点进行操作所以不用虚拟头结点。这道题的思想是从后往前进行对齐,因此我们需要先求出两条链表的长度,然后让长的那条链表与短的进行对齐,然后统一往后一个个节点比对,从而找到相交节点。(同160.链表相交)
2024-03-07 16:42:43
140
原创 从零开始的LeetCode刷题日记:19.删除链表的倒数第N个节点
这道题是道链表题,涉及到头结点的操作所以使用虚拟头结点。此外这也是道典型的双指针题目,只要快慢指针之间间隔n就可以做到让慢指针指向需要删除的节点的前节点,以此来完成删除操作。
2024-03-07 16:36:41
297
原创 从零开始的LeetCode刷题日记:24. 两两交换链表中的节点
这道题虽然是中等题,但其实理清楚逻辑之后就不难,因为涉及对头结点的操作,所以选择使用虚拟头结点来解决问题。画图之后能发现,slow节点的前后两条线都被切断了,所以可以首先让slow->next = fast->next,这样一来fast两端的线也都被斩断了,可以让fast->next = slow,最后让pre->next = fast就完成了slow与fast节点的对换。在此之后让pre = slow即可继续往下两两交换了。当slow或者fast有一者走到了NULL则退出循环。
2024-03-07 16:31:20
207
原创 从零开始的LeetCode刷题日记:206.反转链表
这是一道链表题,但由于没有涉及头结点的独立操作所以不需要用到虚拟头节点。整体的逻辑非常简单,因为我们是从前往后来调转,所以我们需要一个指针指向fast指针的下一个节点,这样就能在翻转slow和fast节点之后还能够找到链表之后的节点。
2024-03-07 16:22:46
213
原创 从零开始的LeetCode刷题日记:707.设计链表
这道题也是一道链表题,使用虚拟头节点来处理。整体的逻辑都是很简单的,需要注意的是判断索引值是否合理的时候,需要注意按索引增加链表节点时要比get和delete多一位,即>len。
2024-03-07 16:14:51
319
原创 从零开始的LeetCode刷题日记:203. 移除链表元素
这道题是链表的开始,一般链表都使用虚拟头结点比较方便,这样不用为头结点单独写一套逻辑。这道题只需要不停地往下遍历,找到对应节点跳过式删除即可。
2024-03-07 15:57:57
222
原创 从零开始的LeetCode刷题日记:54. 螺旋矩阵
这道题与59类似,不同的一点是矩阵的行和列不一定相等,所以循环体大致不变,只需要在最后处理好中间剩下的那一行或者列的元素即可。
2024-03-03 14:08:00
228
原创 从零开始的LeetCode刷题日记:59. 螺旋矩阵 II
一入循环深似海,这道题最关键的点有两个。第一,需要判断出循环的条件,也即loop的求法。第二,需要遵循循环不变量的原则,确定好循环的规则(左闭右开),并在每次写好一条边时更新下次开始写的坐标值。
2024-03-02 20:00:12
321
原创 从零开始的LeetCode刷题日记:904. 水果成篮
这道题整体的思路是:定义出一个滑动窗口,并定义好左右果篮来记录当前可以进入窗口的水果种类。往前遍历,当遇到能摘进果篮的果树时,判断是否需要更新答案。当遇到放不进果篮的情况时,首先判断左右果篮是否为同一种水果,如果是则将新品种放入右果篮。如果不是,第一步是将新品种放入右果篮,然后从它的左侧开始重新生成滑动窗口并不断往前遍历得到窗口左边界。这道题可以当做是一道滑动窗口来做,但他不同的点在于,我们需要从后往前遍历生成新的窗口,而非传统上的直接往后挪动left指针。当然这道题可以用哈希表来辅助,但其实没有必要。
2024-03-02 19:27:30
329
原创 从零开始的LeetCode刷题日记:209. 长度最小的子数组
这道题是一道典型的滑动窗口的题目,重点在于当窗口的左边界向前移动时,窗口内数据总和需要进行退格,并且留意输出是检查是否存在这样的子数组。用for循环时每一个新的元素都应当被加入到子数组中,然后再不断检查前移左边界。
2024-03-02 19:12:06
187
原创 《动手学深度学习》学习笔记:11 模型选择 + 过拟合和欠拟合
然后执行k次模型训练和验证,每次在k−1个子集上进行训练, 并在剩余的一个子集(在该轮中没有用于训练的子集)上进行验证。在实际中,我们只能通过将模型应用于一个独立的测试集来估计泛化误差, 该测试集由随机选取的、未曾在训练集中出现的数据样本构成。当我们有简单的模型和大量的数据时,我们期望泛化误差与训练误差相近。当我们有更复杂的模型和更少的样本时,我们预计训练误差会下降,但泛化误差会增大(此处可以画出四宫格)。是指, 模型应用在同样从原始样本的分布中抽取的无限多数据样本时,模型误差的期望。
2024-02-05 19:23:29
701
原创 《动手学深度学习》学习笔记:08 线性回归
线性回归可以看做是一层的神经网络,那么它的构建与训练的流程是相当完善的,可以通过解剖这只麻雀来熟悉神经网络从构建数据集到预测的全部流程。整体包括了生成数据集、读取数据集、定义模型、初始化模型参数、定义损失函数、定义优化算法、训练、预测等过程。
2024-02-02 21:10:07
134
原创 从零开始的LeetCode刷题日记:977.有序数组的平方
本题的关键在于比较正数负数对应平方值的大小,因此完全可以从头尾两端同时往中间遍历,类似归并排序。也可以找到正数和负数的分界再归并排序,效果一样。
2024-02-02 16:00:21
236
原创 从零开始的LeetCode刷题日记:844. 比较含退格的字符串
由于#会对前方出现的元素进行退格,可以考虑从字符串的尾端往前遍历,记录下#的个数并向前忽略对应个数的元素即可。但一定要注意索引不能够超出数组边界,可以通过添加判断语句防止索引。自己解题的时候没有想到从后往前遍历,而是通过从前往后的顺序进行遍历并退格,这里要注意边界。1)从前往后遍历记录新数组。2)从后往前遍历比较元素。
2024-02-02 15:17:33
248
原创 《动手学深度学习》学习笔记:04 数据操作 + 数据预处理~ 07 自动求导
其中删除法是直接将有缺省值的数据删除,而插值法则是将缺省值作为一个新的类型,可以在后续将此有缺省值的特征进行编码或者制作成如下图所示的类似one-hot的样式(如果此特征对应种类较少)。很多习以为常的操作都会占用新的内存,影响程序运行,如Y = X + Y得到的Y会占用新内存来存储,可以用Y[:] = X + Y 或者 Y += X来避免。可以使用自带的函数来做tensor与numpy的互相转换,也可以用内置函数来转换单元素tensor。cat()函数可以用来拼接张量,dim用来选择拼接的维度。
2024-01-26 22:03:12
464
1
原创 从零开始的LeetCode刷题日记:283. 移动零
本题是一道双指针题目,可以使用swap函数进行换位,也可以最后处理slow下标后方的数组元素。
2024-01-26 14:57:47
193
1
原创 从零开始的LeetCode刷题日记:26. 删除有序数组中的重复项
本题是一道双指针题目,重点是通过slow指针指向的数组元素来判断fast指针指向的数组元素是否该被记录到新数组中去。只有当两者不相等(或者fast指向的更大)时才进行赋值操作。
2024-01-26 13:41:31
273
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人