- 博客(35)
- 收藏
- 关注
原创 代码随想录算法训练营第四十一天| 动态规划part03
返回满足题意的二叉搜索树的种数。),并使这些整数的乘积最大化。个节点组成且节点值从。你可以获得的最大乘积。
2023-09-04 14:48:37
260
原创 代码随想录算法训练营第三十九天| 动态规划part02
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。这题主要思想就是,初始化时候如果遇到障碍物就直接break了,因为后面的都到达不了。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格的左上角 (起始点在下图中标记为 “Start” )。网格的左上角 (起始点在下图中标记为 “Start” )。网格中的障碍物和空位置分别用。
2023-09-02 15:33:51
1183
原创 代码随想录算法训练营第三十八天| 动态规划part01
在纸上画图找关系,确定dp数组然后发现也有dp[i] = dp[i-1] + dp[i-2]但是注意是从1开始。所以初始化dp[1] 和 dp[2]。3 初始化数组,这里我选择初始为dp = [0]*(n+1),因为要遍历到n,不然会比较麻烦。2 递推公式,题目已经给了 dp[i] = dp[i-1] + dp[i-2]。个台阶向上爬需要支付的费用。F(n) = F(n - 1) + F(n - 2),其中 n > 1。1 定义dp[i]的意义,这里i当然表示第i个斐波那契数。4 遍历顺序:从前到後。
2023-09-02 10:50:09
161
原创 代码随想录算法训练营第三十七天| 贪心算法 part06
flag设置成字符串长度也是为了方式像1234这样的情况,本身就符合要求,那么flag就不会变化,如此以来第二个for循环就不会执行了。核心思想:当i的数值比前一位要小的时候,flag标记i的位置,将i开始的后面的数变成9。学完以后发现贪心的做法还是不一般,细节也非常之多。1 定义一个函数,来判断该数是否符合递增的条件。给定一个二叉树,我们在树的节点上安装摄像头。计算监控树的所有节点所需的最小摄像头数量。2 遍历从0到n的范围,不断更新最大值。当且仅当每个相邻位数上的数字。的最大数字,且数字呈。
2023-08-31 22:00:03
173
原创 代码随想录算法训练营第三十六天| 贪心算法 part05
拿到这道题我的想法是,定义一个count来计数,按照左边界来排序,然后对比从下标1开始的元素的右边界是否小于前一个元素d左边界,有则加一,并且更新右边界值,但是这个方法在遇到负数的时候出错了。3 合并操作左边界就应该更新为i-1的左边界的值,注意右边界的更新要用max来判断,取i和i-1右边界的最大值,然后更新result数组【-1】的值就可以了。看到一半就恍然大悟了,原来在更新右边界值的时候需要取最小值,因为这样才能保证区间右边界是最小的。一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
2023-08-30 14:50:28
122
原创 代码随想录算法训练营第三十五天| 贪心算法 part04
比如,如果我们使用lst.insert(10, 9),在索引位置10处插入数字9,由于列表lst的长度为4,所以数字9会被插入到列表的末尾,结果就成为了[2, 4, 6, 8, 9]。举个例子来说明,如果有一个列表lst = [2, 4, 6, 8],我们可以使用lst.insert(1, 3)来在索引位置1处插入数字3,结果就成为了[2, 3, 4, 6, 8]。总结一下,Python的insert()函数可以在列表的指定位置插入一个对象,如果插入的位置超出了列表的长度,对象会被插入到列表的末尾。
2023-08-29 15:32:54
163
原创 代码随想录算法训练营第三十四天| 贪心算法 part03
2 如果遇到正数了,说明负数已经用完了。如果此时k还没有用完,此时再次给列表排序,选择列表中第一个数也就是最小的正数不断取反,直到k用完。1 给列表排序,如果元素都是负数或者是0,那么就一直使用k的次数不断取反。,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回。你从其中的一个加油站出发,开始时油箱为空。请你给每个孩子分发糖果,计算并返回需要准备的。你有一辆油箱容量无限的的汽车,从第。以这种方式修改数组后,返回数组。可以多次选择同一个下标。个加油站需要消耗汽油。表示每个孩子的评分。
2023-08-28 16:00:17
121
原创 代码随想录算法训练营第三十二天| 贪心算法 part01
在每一天,你可以决定是否购买和/或出售股票。数组中的每个元素代表你在该位置可以跳跃的最大长度。这个覆盖法非常巧妙但是也非常难想,贪心的题实在不好总结。判断你是否能够到达最后一个下标,如果可以,返回。向前跳转的最大长度。生成的测试用例可以到达。你也可以先购买,然后在。处,你可以跳转到任意。给你一个非负整数数组。
2023-08-27 20:42:21
121
原创 代码随想录算法训练营第三十一天| 贪心算法 part01
2 做法上局部最优就是将不符合要求的元素删除(不需要真正删除,跳过即可),使用指针i来遍历,定义prediff = num[i] - num[i-1] 和curdiff = num[i+1] - num[i] 来判断当前元素是否是峰值。注意点在更新之后,如果count值小于0了则重置,这样很神奇的避免了数组全是负数也能取最大值的问题。1 首先题目中对摆动的定义:仅有一个元素或者含两个不等元素的序列也视作摆动序列,所以数组的两头是要考虑有没有可能符合条件。假设你是一位很棒的家长,想要给你的孩子们一些小饼干。
2023-08-25 20:19:05
48
原创 代码随想录算法训练营第三十天| 回溯算法part06
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。的棋盘上,并且使皇后彼此之间不能相互攻击。编写一个程序,通过填充空格来解决数独问题。这道题还是没有完全理解,下次继续学习吧。数独部分空格内已填入了数字,空白格用。的棋子放置方案,该方案中。每一种解法包含一个不同的。分别代表了皇后和空位。
2023-08-24 21:10:10
98
原创 代码随想录算法训练营第二十九天| 回溯算法part05
1 首先这里是要求所有长度大于1的递增序列,所以和子集一样的地方是在整颗树是取,因此定义一个判断函数,如果符合就添加即可,剩下的问题就是如何去重了。看完以后想想既然不能用used数组我建立一个数组count统计出现的合法数组不就行了,如果取的子序列已经在 count中就跳过即可。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。2 去重上就遇到了问题,不能使用排序打乱数组的顺序,如何有效去重呢。,找出并返回所有该数组中不同的递增子序列,递增子序列中。返回所有不重复的全排列。
2023-08-23 20:34:03
102
原创 代码随想录算法训练营第二十八天| 回溯算法part04
1 终止条件里 如果startindex == len(s)就代表切割到数组尾部了,注意path数组的长度也要为4才行,这点我忽略了想了好久。看完以后觉得理解startindex和for循环中变量i还是非常重要的,我认为回溯算法中最抽象的莫过于这里,搞懂回溯树还是任重而道远啊。2 然后定义一个判断是否合法的函数,如果有非数字的不合法,长度不为1且开头是0的不合法当然数字超过255的也不合法。,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。,用以表示一个 IP 地址,返回所有可能的。
2023-08-22 16:12:44
104
原创 代码随想录算法训练营第二十七天| 回溯算法part03
看完以后理解了许多,理解并且能画出递归树十分重要,由于求的是组合不是排列,所以一样需要startindex来约束,但是本题的元素可以重选,因此在递归里 startindex 的参数就为i而不少i+1了,因为自己也要选择。看完以后明白了不少细节,其实最妙的就是startindex本身也能控制切割字符串,而数层i则也可以作为i 的右边界,因此path添加的其实不是单个的字符,而是切割不同区间的s。看完以后受益匪浅,这种去重的操作就需要used数组来辅助了,首先要弄清楚树枝去重和树层去重的概念。
2023-08-21 15:05:55
128
原创 代码随想录算法训练营第二十五天| 回溯算法part02
最重要的是处理好数字的映射关系和理清楚递归函数参数的问题,由于一个数字对应多个字母,所以要被每个数字提取出来来进行处理和递归。有了前车之鉴,这次看了也是求组合,那么就需要定义一个startindex来约束取数的范围。注意这个index是用来控制字符串数字遍历的位置,告诉我们当前遍历到哪个数字了。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。该列表不能包含相同的组合两次,组合可以以任何顺序返回。的字符串,返回所有它能表示的字母组合。所有可能的有效组合的列表。
2023-08-19 14:19:22
215
原创 代码随想录算法训练营第二十四天| 回溯算法part01
定义回溯函数,依然是确定终止条件当path数值长度为k时result数值添加path数值,返回,只不过for循环遍历的时候需要进行剪枝控制,因此直接将起始位置定义为startindex,在递归中控制将 startindex自增。然后进行回溯就可以了。自己按照回溯的模板尝试写了,但是发现输出出来的不是组合,而是排列。今天开始进入了回溯算法的练习,经历了二叉树的递归洗礼,已经对回溯有了一个大概的认识了,回溯函数就是递归函数。回溯并不是一个高效的算法,可以说是纯暴力,但是有些恶心的问题只能通过回溯来解决。
2023-08-18 14:45:26
93
原创 代码随想录算法训练营第二十三天| 二叉树part09
改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。2 获取当前头结点,即下标为len(nums)//2的元素,初始化。通过修剪二叉搜索树,使得所有节点的值在。给你二叉搜索树的根节点。
2023-08-17 15:08:06
151
1
原创 代码随想录算法训练营第二十二天| 二叉树part08
递归的逻辑也很简单,如果root为空说明找到插入的地方了,初始化节点返回。这里有点让人懵的就是返回的节点怎么被接住,所以递归函数需要一个root.left 或者root.right来接住,这里是我之前没有搞懂的地方。中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(4 左右孩子都不为空,这里最复杂,将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
2023-08-16 21:26:30
99
1
原创 代码随想录算法训练营第二十一天| 二叉树part07
看到要求求最小差值,就意识到需要使用双指针来处理树,我选择使用中序遍历来解决,定义一个全局变量self.pre来作为前一个结点的指针,另一个全局变量diff来更新结点的最小差值。看懂了指针行走的顺序就明白了,由于是中序遍历且是二叉搜索树,其数值必定是单调递增的,所以root.val - pre.val的值必不可能为负数,因此就不需要使用abs()了。中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(
2023-08-15 16:06:15
157
原创 代码随想录算法训练营第二十天| 二叉树part06
然后学习一下优化的双指针法,定义一个全局变量pre,如果pre不为空比较pre和前结点的值,如果前结点pre大于等于当前遍历的root则return False,都是建立在中序遍历上的。都是中序遍历的思想,之前学习这道题的时候参考他人的极简代码,导致自己根本没有理解二叉搜索树的特性。看完视频发现自己把这道题目想复杂了,还是按照递归三部曲来处理两颗树就可以了,新造一个树和在其中一棵树上操作都是可以的,当一个树为空的时候返回另外一个树的结点即可。null 的节点将直接作为新二叉树的节点。
2023-08-14 15:03:57
101
原创 代码随想录算法训练营第十八天| 二叉树part05
看完才知道原来这个题就直接使用了回溯算法,使用全局变量设置一个深度,通过回溯来测量每个分支的深度,同步更新最大深度,保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。代码中加粗的位置就是本题是坑所在,本题中递归是有返回值的,如果左孩子的递归函数有符合要求的路径应该直接将这个True向上返回,右孩子也是同理。加了这个条件就通过了,这道题可以说是非常有意思了,虽然是简单题,但是感觉一点都不简单。有了上题的经验这次回溯就注意了许多,由于需要遍历完整颗树,这里递归函数不需要返回值。
2023-08-13 14:05:16
166
1
原创 代码随想录算法训练营第十七天| 二叉树part04
这是需要使用回溯算法需要解决的题目,因为需要记录以根节点为起点的所有路径,所以需要使用前序遍历,并且设置path数组记录路径,result数组添加结果,这是一道真正的回溯算法题,第一次做感觉有点难,需要后续不断练习才行。本来是一道很简单的题,但是题目表述却非常绕,例子也给的少所以有点不明所以,画图搞懂以后就明白了,我们等一个结点有左孩子,且这个左孩子没有孩子结点的时候,这个孩子结点就是左叶子。给定一个二叉树,判断它是否是高度平衡的二叉树。,返回所有从根节点到叶子节点的路径。是指没有子节点的节点。
2023-08-11 14:51:29
104
1
原创 代码随想录算法训练营第十六天| 二叉树part03
看完以后发觉自己还是想少了,其实这个做法是依靠后续遍历的方式,自底向上计数,也就是说其实求的是二叉树的高度,只不过此题中二叉树的高度就是二叉树的最大深度。的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。递归这里一定要分情况讨论,以及用result接住递归的数值,不然会报错。反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。所以,如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。
2023-08-10 14:13:06
145
1
原创 代码随想录算法训练营第十五天| 二叉树 part02
看完后对这道题的认知又增进了一步,尤其是自己在纸上又模拟了前后序遍历的方式为什么可以方便的解决这道题,以后做相关递归的题目时应该提前先想想采用哪种遍历方式。题目描述有点难懂,最后发现就是个链表,所以还是层序遍历,然后使用循环把每层除了最后一个结点连起来就成了,注意是链表所以返回的都是root。想了一会得到一个思路,当遍历到一个结点没有左孩子也没有右孩子的时候,这棵树最小深度就找到了,将这一层加入数组后,直接返回数组长度即可。,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
2023-08-09 15:22:27
145
1
原创 代码随想录算法训练营第十四天| 二叉树part01
首先我依然使用广度优先搜索的方法,后续遍历是左右中,看上去有点麻烦,但是发现只有按照中-右-左的顺序将元素放入数组中,将按照栈的方式从栈顶取出放入新列表中就是倒过来的左-右-中顺序了,这里我直接将列表反转输出即可。写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。2 由于前序遍历是中左右,所以要先将中也就是根节点pop出来然后加入数组,然后检查结点有没有左右孩子。
2023-08-08 15:45:27
103
原创 代码随想录算法训练营第十三天| 239. 滑动窗口最大值、347. 前 K 个高频元素
拿到这道题首先尝试使用暴力法,遍历数组的长度 len(nums) - k + 1次 计算每个区间的最大值,然后将其添加到列表里,由于max()函数的时间复杂度是O(n),所以整体时间复杂度为 O(n*k)(max作用的区间数组长度为k),再看题目给出的。看了4遍然后自己模拟了好久才搞懂,使用单调队列来控制删除,添加元素来达到效果,自己尝试着运行代码才发现 定义的push()中已经包含了区间内删除不符合要求的元素的特性。今天的两道题含金量感觉非常高,单挑队列和使用小顶堆解决问题,都是非常需要时间思考的。
2023-08-07 21:45:43
74
原创 代码随想录算法训练营第十一天| 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值
卡哥这里使用了一个小技巧在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了 ,当然还有一个剪枝如果字符串总长为奇数直接判定false就可以了。有了前面括号匹配问题的经验后,做这道题就很快了,不过就像视频里说的一样,如果我们没有意识到用栈来解决,这道题就非常不容易了。由于题目告诉你了使用栈,那么思路就好想了,如果不是运算符就加入栈中,遇到运算符就依次取出栈顶的两个元素,然后进行对应的运算。每个右括号都有一个对应的相同类型的左括号。
2023-08-05 16:49:41
27
1
原创 代码随想录算法训练营第十天| 232. 用栈实现队列、225. 用队列实现栈
使用两个栈来模拟队列理念似乎很简单,第一个栈用来添加数据,然后将第一个栈的数据倒腾入第二个栈中,这样第二个栈栈顶出数就相当于队列的先进先出了,不过有一点我踩坑了,我的。当stack1为空时,才将stack中的元素倒腾到stack1中,否则,新添加的数据在stack中先待命,等stack1空了再做入栈。视频里使用一个单向队列来模拟栈的方法太巧妙了,将队列第一个至倒数第二个元素前出队列,再入队列,再将队首元素出列即可。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(
2023-08-04 13:33:11
27
1
原创 代码随想录算法训练营第九天| 28. 找出字符串中第一个匹配项的下标、459. 重复的子字符串
给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从 0 开始)。如果needle不是haystack的一部分,则返回-1。拿到这道题首先试一下无脑的解法,由于python中关于字符串的库函数特多,比如消除空格及特殊字符的strip,分隔字符串的split,链接字符串的join,这里则可以使用find,find()方法用于在字符串中查找指定的子串,并返回第一次出现的索引位置。如果找不到子串,则返回-1。
2023-08-03 21:19:39
142
原创 代码随想录算法训练营第八天| 344.反转字符串 、 ● 541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
代码非常简单,就是i每次反转完毕[i:i+k]段后跳跃2k步,但是对于我这种比较生疏,对这种方法使用甚少的小白来说反而难想,总是想着定义一堆函数来解决问题,但总是把问题搞的越来越难了。然后就是for循环用多了,总是下意识就写for i in range(len(s)), 完全忘记了可以控制i的步数的问题,这道题算是让我练习控制循环的步数了。经过了前面几道题的洗礼,我选择将n位置及之前的元素切片出来,直接加在原字符串的尾部,然后返回下标n开始的字符串即可。编写一个函数,其作用是将输入的字符串反转过来。
2023-08-02 16:41:50
47
原创 代码随想录算法训练营第七天| 454.四数相加II 、 383. 赎金信、15. 三数之和 、18. 四数之和
拿到这道题首先我想使用暴力解法试试看,然后发现如果无脑使用三层循环会出现元组重复的问题, 使用哈希表的时候我也发现了这个问题,尝试了发现找不到一个有效的方法来去重,于是去看视频学习。三数之和升级版,看完视频认识到三数之和就是一个循环两个指针,四数之和就是两个循环两个指针,然后就是去重,细节很多,今天这两道题可以说是很烧脑了。原来这题看上去是使用哈希表,但实际上使用哈希表会出现非常多的问题,使用双指针才是正确的,去重一直也是我的弱项,这道题应该好好研究。答案中不可以包含重复的三元组。,判断是否存在三元组。
2023-08-01 15:27:42
29
1
原创 代码随想录算法训练营第六天| 242.有效的字母异位词 、 349. 两个数组的交集 、202. 快乐数 、1. 两数之和
这道题虽然简单,但是我还是懵了,想了想大致有两种情况,第一种情况是当然是经过运算最终得到 1 输出True,第二种情况就是不是1,但是又可能分为两种情况,一种是最终结果是一个不是1的个位数,另一种是无限循环下去了,这会导致代码运行陷入死循环的局面。然后开始学习视频中卡哥使用的方法 ,建立一个长度为26的数组,利用字母ASCII码的特性将字符串s的字母一一映射到数组里,然后检查字符串t,对照字符串t的元素再数组中做减法,如果操作完毕后数组全是0,则相等。整数,并返回它们的数组下标。,编写一个函数来判断。
2023-07-31 15:22:42
54
1
原创 代码随想录算法训练营第四天| 24. 两两交换链表中的节点 、 19.删除链表的倒数第N个节点 、面试题 02.07. 链表相交 、142.环形链表II
看完视频以后基本清楚了思路,我在具体实现上将快慢指针起始位置都安置在哨兵结点上,然后先让快指针走n步,然后让快慢指针同时运动,当快指针的下一个结点为空时循环结束,这样慢指针就停留在被删除结点的前一个结点了,按照方法删除结点就可以了。链表问题最让我痛苦的就是空指针报错,虽然意识到了需要快慢指针进行操作,但是在具体细节上还是出了差错,为了删除倒数第n个结点,首先要让慢指针走到被删除结点的前一个结点,那么如何让快慢指针运动来达到这个效果呢?给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。
2023-07-30 18:51:27
25
1
原创 代码随想录算法训练营第二天| 977.有序数组的平方 、209.长度最小的子数组 、 59.螺旋矩阵II
需要总结的细节感觉还是非常多的,做矩阵的题目感觉都非常绕,非常容易出错,譬如需要定义mid,当n为奇数时,需要给mid填上数字;这道题感觉还是要在纸上画图才行,尤其是确定内部循环的时候。看了4遍视频后,自己痛苦的尝试,定义循环不变量后开始从左到右,从上到下,从右到左,从下到上填数,又错了几次,然后自己在纸上画图来纠错,这道题花费了近一个小时,终于通过了。这道题一出来人就懵了,由于之前基本没有做过矩阵相关的题目,导致做这种题目相当的难受,对于如何控制循环和变量完全没有清晰的逻辑,于是直接看视频学习。
2023-07-27 16:47:45
231
1
原创 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
这个视频确实对不熟悉二分查找法细节的人是非常有帮助的,首先是对常用的左闭右闭区间的细节做了分析,对于边界划分模糊的我受益匪浅。按照惯例先摸索再看视频,由于刚刚做过二分查找视频第一反应是能不能用类似的方法解决,发现题目说元素顺序可以改变后就想能不能把排序后列表中要删除的元素左边界和右边界找出来,试了一下用以下代码通过了。然后发现这种覆盖元素的解法真是巧妙,但是略有一点烧脑,尤其是第一遍看快慢指针的作用是对代码的加减操作感到不解, 但是理解以后也感觉收获颇丰。的元素,并返回移除后数组的新长度。
2023-07-26 11:04:30
446
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人