- 博客(39)
- 收藏
- 关注
原创 代码随想录day45&day47
即当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]根据dp[i][j]的定义,dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。对dp[i],遍历j
2024-07-24 16:45:58
241
原创 代码随想录day43&day44
dp[i][0] 表示第i天持有股票所得最多现金 ,其实一开始现金是0,那么加入第i天买入股票现金就是 -prices[i], 这是一个负数。上一题的进阶版,这个题目需有2k+1个状态(因为要有第二层循环,为了写法统一,需要有表示不操作的维度)所有奇数项的初始化都为-price[0],公式根据定义注意推导。dp[i][1] 表示第i天不持有股票所得最多现金。
2024-07-22 16:05:09
454
原创 代码随想录day42
下标为0记录不偷该节点所得到的的最大金钱,下标为1记录偷该节点所得到的的最大金钱。不偷本节点:左节点偷与不偷的最大值+右节点偷与不偷的最大值。偷本节点:本节点数值 + 不偷左孩子的值+不偷右孩子的值。树形dp数组,每个节点返回一个size为2的dp数组。考虑i:dp[i-2]+nums[i]环形数组,拆成两个线性数组分别计算。不考虑i:dp[i-1]初始化要按照实际情况来。
2024-07-18 12:14:53
141
原创 代码随想录day41
如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。跟上个题目一样,不过本题目使用先遍历背包再遍历物品,代码会好写一点。最少种类问题,采用min函数,除了【0】以外用inf初始化。
2024-07-18 11:25:55
322
原创 代码随想录day39
2.先物品再背包---组合问题,先背包在物品---排列问题。要保证j-coin>=0,可以手动控制背包的遍历范围。组合问题,先背包在物品。背包在外层,物品在内层。组合问题,先物品再背包。物品在外层,背包在内层。背包在外,不能直接控制,物品没办法手动控制。1.遍历顺序改为正序遍历。
2024-07-15 23:24:25
165
原创 代码随想录day37 & day38
dp[0] =1 因为背包容量为0 只有一种装法---什么都不装。3. 先遍历物品再遍历背包。遍历背包时有条件要求。因为是子集个数,不选--不变,选了子集个数+1。4. 根据dp函数进行初始化,全为0。求装满left容量的背包有多少种方法。核心是转换问题,细节与上一题一样,二维dp数组问题(本质上是三维)计算装满背包有多种方法。
2024-07-15 18:27:25
226
原创 代码随想录day36
dp[i] 代表将 i 拆分后的乘积最大值,初始化策略要改变,遇到障碍后,之后的都是0。dp更新策略改变 ,遇到障碍跳过。计算方式有两种:j x i-j。或者 j x dp[i-j]本质上也是二元的思维,上边、左边初始化为1。采用求和进行dp运算。
2024-07-09 12:47:49
141
原创 代码随想录day31
作差,从0索引开始遍历,currentsum若为0 ,从当前索引的下一个索引重新开始遍历,保证currentsun一直大于0。二维排序问题,先从左往右排序,再从右往左排。注意拍完之后要去左右两次结果的max数值。简单,注意收20块的两种找零情况。
2024-06-23 09:49:06
130
原创 代码随想录day30
如果有剩余(k%2,剩余奇数个只操作1次,偶数个全部抵消),只对最后一个数进行操作。两个范围,一个当前覆盖范围,一个下一步覆盖范围。在cover内迭代,不断更新cover范围。先按照绝对值排序,从头到尾遍历。
2024-06-23 09:31:26
181
原创 代码随想录day27
string中没有insert和pop,自己写。使用used数组,记住两个犯错的点。:最后一段也valid,加入结果。简单,注意每层都记录即可。
2024-06-18 14:10:54
171
原创 代码随想录day26
use数组,用来区分树层去重,还是树枝去重。把startindex看作隔板,从0位置开始。树层去重:数值=前一个数的数值,且前一个数。进行排序,然后可以在for之后做一个剪枝。首先需要对数组进行排序。
2024-06-17 18:30:40
186
原创 代码随想录day24
for i in range(startindex,n-(k-len(self.path))+2):为剪枝操作,对长度k的遍历进行剪枝。字符串没有-=操作,回溯用s=s[:-1]用[:]将列表固定住。
2024-06-15 17:14:47
176
原创 代码随想录day23
然后处理符合条件的情况(修剪左右子树,并连接,返回本节点)先处理不符合条件的情况(修剪左右子树并返回)特殊中序遍历(右中左),双指针。
2024-06-14 14:57:49
133
原创 代码随想录day20
只有寻找某一条边(或者一个节点)的时候,递归函数会有bool类型的返回值。终止条件:root1为空,返回root2;root2为空,返回root1。终止条件:遍历到none节点时,其实是一个搜索树,返回true。函数要返回bool值,用于判断(left&right)与上一题类似,注意判断nums数组终止条件用len。中序遍历:只判断root.val>maxval即可。设立初始值float('-inf')中序遍历,得到单调数组,进行判断。在root1树上原地进行操作。None现在终止条件前面,
2024-06-11 12:40:41
282
原创 代码随想录day18
count--right value(前序)count--left value(前序)count+left value(回溯,count+left value(回溯)if 递归函数 true (递归,if 递归函数(递归)if 右边节点存在:(条件)if 左节点存在:(条件)前序遍历,终止条件分两种。
2024-06-09 19:37:10
153
原创 代码随想录day17
然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。遍历方法:后续遍历,none节点停止。思路:当遇到左叶子节点的时候,if 左节点存在:(条件)
2024-06-09 18:33:07
119
原创 代码随想录day16
判断满二叉树:一直向左遍历的层数====一直向右遍历的层数。对于右子树为空、左子树存在的特殊情况进行处理,对每个结点来说,判断其是不是构成一个满二叉树。使用max函数,取左右子树最大值递归‘使用min函数,取左右子树最小值递归‘对于左子树为空、右子树存在。判断每个节点是不是满二叉树。
2024-06-09 17:50:18
252
原创 代码随想录day15
分期递归中最后return 是最后一步才执行,还是中间就执行。return只被最后一步调用(迭代过程中不会出现返回值)要设立一个size,记录每层的个数,双层while循环。采用后续遍历的思想,先判断左右子节点,在判断父节点。return被反复调用(迭代过程中会出现返回值)前序和后续一样,中序代码不一样。
2024-06-05 12:40:23
195
原创 代码随想录day14
删除:分情况,度为0:直接删除;度为1:使用子节点替换;度为2,使用左子树的最大节点或者右子树的最小节点进行替换,右子树的最小节点为中序遍历的下一个节点。查找、增加:思路相同,从根节点开始遍历即可。左子树所有节点<根节点<右子树所有节点。满二叉树:所有层节点都被填满。函数名,返回值,输入参数。前序、中序、后序遍历。
2024-06-04 20:07:34
244
原创 代码随想录day13
2.先让前k个元素入堆,然后下一个元素入堆前,先和堆顶元素比较,大于则入堆--弹出,小于不进行操作。设立一个单调队列,有pop,push,和getmaxvalue三种操作。当队列不为空,且队列最左侧value=遍历到的value,出队。1.每个元素逐一入堆,当堆内元素个数大于k时,入堆时同时弹出。当进队的元素比前面的大,前面的出队,保持窗口单调递减。然后循环执行入队,出队,取值操作。构建top k 堆的两种方法。原则:两头出队,一头进队。先创建一个完整滑动窗口,
2024-06-03 22:14:01
114
原创 代码随想录day11
使用lambda与map,reduce,sorted配合,实现函数式编程。3.遍历完后stack还有多余元素。pop()可以返回也可以不返回。1.遍历过程中stack为空。2.遍历过程中出现不匹配的项。lambda匿名函数。
2024-06-03 21:19:50
155
原创 代码随想录day6
if num in table 与 if num in table.keys()相同。使用一个map,存储nums1,使用一个set提取相同元素。在遍历到每个元素时,查看之前遍历的元素中有没有符合的元素。不能用[[0] for _in range(26)]删除键值对 del table[num]以数值为key,以索引为value。构建set,防止死循环出现即可。提取ASCII码:ord。
2024-05-27 23:28:17
165
原创 代码随想录day4
fast指针每次移动2个,slow指针每次移动1个。两个指针必定能够在环内相遇。当 相遇时,设置index1和index2,同时移动,相遇位置即为环的入口。求出两个列表长度差n,将较长链表的头指针位置移动n隔位置,然后两个链表同时遍历,判断相等条件。2.当链表顺序改变时,改变的箭头尾部元素要记录。1、一定要判断是 是否定条件还是肯定条件。否定条件:画出临界不成立情况,写出否定条件。
2024-05-26 21:58:18
155
原创 代码随想录day3
设置虚拟头节点,在删除、增加节点n,指针要找到前一个节点n-1。从虚拟头节点开始遍历,while条件为current.next(此时current指向最后一个节点)双指针,cur起始位置为head,pre其实为none。每次循环,1.temp存储cur下一个元素。2.反向链接 3.移动位置 直到cur为None。4.while 判断条件与cur其实位置匹配,从dummy_head开始为cur-1。画图法:判断指针移动的次数,与index的关系。3.判断条件,举例子,然后取反。
2024-05-24 18:33:36
311
1
原创 代码随想录day2
注意循环不变量:每次循环执行时,处理边界的标准要一致(与二分法开闭区间的思想相同),填充顺序为:1-2,3-4,5-6,7-8,9(start:end-offset)滑动窗口法,遍历窗口结束位置,然后动态调节起始位置。应该预先设置result为最长长度,之后在调节窗口起始位置时不断更新result。采用双指针法,仍然需要注意区间的开闭判断情况。
2024-05-23 18:59:00
155
1
原创 李宏毅NLP第十节
elmo中提取上下午的方法,先分别预测w4和w5,再把两个向量concat作为w4的预测。bert中的做法,预测位置设置为mask或者随机向量,每个位置预测时输入的大小是相同的。每个位置只输入前文,对向量做softmax和交叉熵得到结果。bert的思路和之前的一篇文章类似,不过模型复杂的多。2.自监督训练,输入上下文,预测其中某个位置。1.采用翻译的方法。需要配对的pairs。
2024-05-09 17:54:03
230
原创 李宏毅NLP第九节
任务一:句子种类输出:加入cls标志,该标志跟整个句子信息有关,embedding输出分类。在预训练模型中加入apt层,只微调apt层,固定其余部分,节省空间,同样达到优秀效果。任务三:QA,输入文献d,问题q,模型返(回e,s)为文献d中起止字符位数。任务四:文转文,第一种架构,弊端是decoder不能使用预训练模型。以整个句子为编码,分割token,再生成embedding。调apt层效果接近全局微调,蓝色线为只调预训练模型的部分层。微调分类:全局微调和局部微调,全局微调效果更好。
2024-05-08 17:13:37
449
原创 hello-算法-复杂度分析
尾递归:在调用时计算(传参时计算);普通递归:在执行时计算,返回时计算。忽略常数,省略系数,取最高阶。O(2^n):递归树,暴力穷举。O(n):遍历数组或链表。O(n^2):嵌套循环。
2024-05-04 21:42:30
253
原创 李宏毅NLP第八节
state只与关心的信息有关,记录这些信息,过滤无关信息。2.Word Segmentation:用于中文,二值化结果,输出边界,输入downstream。1.POS — Tagging:标记句子中每个词汇的词性。5. Summarization摘要,对句子进行二值化分类,是否放进摘要里(token是句子)4.Coreference Resolution:指代消解,找出指代相同的词汇。9.句子分类&立场分析(输入连个句子),输入句子,输出句子的分类。6.抽象摘要,输入很多句子,输出也是很多句子)
2024-05-02 18:26:48
45
原创 代码随想录第一、二节
4、for _ in range(N):_为占位符,不参与循环。6. if val(val为非零、非空都返还True)1.split()用来分割字符串,默认是空格分割。就是用来终止离它最近的while、for语句的。8. map对一个list中所用元素用函数处理。2.python 索引是0开始。7. 除法总是返回浮点数。
2024-05-02 16:43:41
25
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人