LeetCode刷题记录
文章平均质量分 73
Oreo_AixiaoNi
这个作者很懒,什么都没留下…
展开
-
LeetCode 第三十三天 2024.8.19
确定递推公式: dp[i][0] = dp[i-1][0], dp[i][1] = max(dp[i-1][0]-prices[i],dp[i-1][1]),dp[i][2] = max(dp[i-1][1]+prices[i],dp[i-1][2]),dp[i][3] = max(dp[i-1][2]-prices[i],dp[i-1][3]),dp[i][4] = max(dp[i-1][3]+prices[i],dp[i-1][4])或者是前一天就是卖出股票状态,一直没操作)原创 2024-08-20 12:21:04 · 1076 阅读 · 0 评论 -
LeetCode 第三十一天 2024.8.18
确定递推公式: if price[i] > price[i-1]: dp[i] =dp[i-1]+(price[i] - price[i-1]) else:dp[i] = dp[i-1]# 同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);# 那么dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);原创 2024-08-19 11:55:42 · 400 阅读 · 0 评论 -
LeetCode 第三十一天 2024.8.17
偷当前节点就不能偷左右孩子,所以dp[val1] = 当前节点的值+不偷左孩子的最大值即左孩子的dp[val1]+不偷右孩子的最大值即右孩子的dp[val1]# 确定递推公式: dp[i] = max(dp[i-2]+nums[i],dp[i-1])# 确定递推公式: dp[i] = max(dp[i-2]+nums[i],dp[i-1])# dp数组如何初始化: dp[0]=0 dp[1] = nums[0]# dp数组如何初始化: dp[0]=0 dp[1] = nums[0]原创 2024-08-18 10:05:19 · 437 阅读 · 0 评论 -
LeetCode 第三十天2024.8.15
确定遍历顺序: 这道题只能先背包再物品,因为物品有顺序,例如"apple" "pen" "apple"和"apple" "apple" "pen" 不一样 所以,j从0到len(s) i从0到j。# 确定递推公式: i从0到j 如果存在dp[i]是true以及dp[j-i]是true那么dp[j]也是true。# 确定递推公式: dp[j] min(dp[j-coins[i]]+1,dp[j])# 确定递推公式: dp[j] min(dp[j-nums[i]]+1,dp[j])原创 2024-08-18 08:21:54 · 299 阅读 · 0 评论 -
LeetCode 第二十九天 2024.8.15
1049. 最后一块石头的重量 II - 力扣(LeetCode)原创 2024-08-16 11:38:45 · 1069 阅读 · 0 评论 -
LeetCode 第二十八天 2024.8.14
确定递推公式: 就看这个物品(重量weight[i])放不放进背包里,放不进去直接dp[i][j] = dp[i-1][j] 能放进去看放进去价值大还是不放进去价值大dp[i][j] = max( dp[i-1][j], dp[i-1][j-weight[i]] +value[i])# dp数组如何初始化: dp[0][i] = 1 dp[i][0] = 1,在有障碍物的地方都是0,并且dp[0][i]和dp[i][0]在i==0后面所有都是0。# 确定遍历顺序: 先遍历物品,然后遍历背包重量。原创 2024-08-15 21:58:11 · 745 阅读 · 0 评论 -
LeetCode 第二十六天 2024.8.13
确定递推公式: dp[n] = min(dp[n-1]+cost[n-1],dp[n-2]+cost[n-2])注意数组初始化是dp[0]=0 dp[1]=0,不是dp[0]=cost[0] dp[1]=[1]# 确定递推公式: dp[i][j] = dp[i-1][j] + dp[i][j-1]# 举例推导dp数组: dp[3][7] = dp[2][7] + dp[3][6]# dp数组如何初始化: dp[0][i] = 1 dp[i][0] = 1。原创 2024-08-14 07:10:29 · 832 阅读 · 0 评论 -
LeetCode 第二十五天 2024.8.12
所以在每次for循环前面设立一个set,for循环里判断现在取的这个数在不在set里,在就不取了。这样就避免了重复问题。这道题的目的是要找到数组的全排列,所以我们不能有startindex这个参数,但如果像上一道题那样对层去重会解决不了对树杈(树的深度)去重的问题,例如会出现[1,1,1]这样的情况,所以我们要对列去重,可以直接在方法中再传入一个参数,这个参数显示应该对哪个元素再列上去重,再遍历完这一列后,再恢复元素。这道题又要对层去重,又要对树杈去重,综合了前两道题的去重方法,就可以做出来了。原创 2024-08-13 10:30:47 · 311 阅读 · 0 评论 -
LeetCode 第二十四天 2024.8.10
看到这道题不要被难住,没有思路是正常的,这道题的难点也是在于怎么去判断递归的终止条件,由于是四段,我们可以用startindex == len(s)和len(path) == 4来判断,同时要验证每次加的字符串是不是合规,我们也要另写一个isvaild函数判断字符串合规状态,别的就不用管了,一直递归就完事了。然而,在这个生成子集的场景中,递归调用不需要提前终止,因此 return 是不必要的。如果你不加 return,继续递归: 不加 return 时,递归调用会继续执行后面的循环和回溯操作。原创 2024-08-11 08:05:45 · 354 阅读 · 1 评论 -
LeetCode 第二十三天 2024.8.9
所以可以先对数组进行排列,然后在对i的for循环中,判断在i>startindex的情况下nums[i] == nums[i-1]的情况,如果满足条件就continue,注意在这里,一定是i>startindex,不能i>0,因为如果i> 0就把枝中的也去掉了。这道题相比之前简单的组合问题,难点在于可以重复选择,重复选择也是需要startindex的,因为如果没有startindex在递归中将会一直在第一个陷入死循环。这道题的难点在于能否想到递归终止条件是startindex == len(s),原创 2024-08-11 05:02:34 · 456 阅读 · 0 评论 -
LeetCode 第二十二天 2024.8.8
所以删除要考虑的情况多一些,尤其是当遍历到当前的结点的值和要寻找的key值相同且当前节点左右孩子都不是none的时候,我们要先找到当前节点右子树的最左边的节点,再把当前节点的左子树放到右子树的最左边的节点的左节点。说实话看起来很绕,但最关键的就是要找的当前节点右子树的最左边的节点。从题目中看懂树是从右下角开始遍历的,像原先的题一样有一个pre节点,一个一个右中左遍历即可。当前节点的值变成当前节点 的值加上pre的值。每次去最中间的元素然后一直遍历,有返回值当作前一个遍历节点的left和right。原创 2024-08-09 12:05:33 · 437 阅读 · 0 评论 -
Leetcode 第二十一天 2024.8.7
这道题可以直接用二叉树最近公共祖先实现,但也可以利用二叉搜索数自己的特性,去从上往下遍历,找到的第一个在p,q节点值中间的节点,即为p,q的最近公共祖先。递归二叉搜索数,遇到空节点且数值合适的位置放进去。思路一,当成普通二叉树从下往上遍历。原创 2024-08-08 11:08:33 · 278 阅读 · 0 评论 -
Leetcode 第二十天 2024.8.6
又忘了怎么对字典的value排序,根据字典中的value对key进行排序用sortdic = sorted(findic.items(), key= lambda item:item[1],reverse = True),注意其中的key= lambda item:item[1]不能省略,省略会自动按照key进行排序。本题要想到是从底部往顶部遍历二叉树,要对二叉树底层判断是不是存在p,q,然后如果存在则返回他们的公共祖先,从底部往顶部遍历的情况优先考虑后序遍历。原创 2024-08-07 08:48:55 · 260 阅读 · 0 评论 -
LeetCode 第十九天 204.8.6
另外定义pre要写self.pre = None而不能写self.pre = TreeNode(),self.pre = TreeNode()默认pre的值为0,在root=[0]或更小的情况下就无法完成递归,返回错误结果。根节点的左子树的所有节点都要比根节点小,同理,右子树的所有节点都要比根节点大,有时候,右边也是二叉搜索数,但由于右子树根节点的孩子比右子树的上层根节点小,会出现错误!二叉搜索数是有序的,左节点的值< 根节点的值<右节点的值,所以遍历的时候可以进行判断。原创 2024-08-06 10:15:07 · 387 阅读 · 0 评论 -
leetcode 第十八天 2024.8.2
要知道两个顺序构造一个唯一的二叉树的思路,后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。还有需要注意的是,一定要先切割中序数组,再根据切割后中序数组的长度去切割后序数组。这道题和寻找二叉树路径很像,只不过没有了现成的节点和数,但我们可以抽象出一个数出来帮助我们理顺递归和回溯的逻辑。对于这道题,在回溯算法的参数中没有考虑到加入starinx来代表遍历开始的节点。本题的如果用到剪枝,注意回溯的时候也要把cursumm - i,和上一道题一样的思路,甚至略简单。原创 2024-08-06 07:22:38 · 373 阅读 · 0 评论 -
leetcode 第十五天 2024.4.30
所以我们不能用层序遍历,这道题的破题思路为判断一个节点的左右子树是否对称,要想到递归的思路,定义一个方法判断一个节点的左右子树是否对称,每次有数种情况,对每种情况分别进行判断以及返回值,注意:每次判断我们需要外侧和外侧判断,内测和内测判断,因此在向下递归的过程中给需要判断左节点的左子树和右节点的右子树,以及左节点的右子树和右节点的左子树。不要被这个题目吓到,拿到二叉树的题目先考虑应该如何去遍历这个二叉树,这道题直接用前序遍历加递归就可以做出来。想到用后续遍历但不会写,对递归的条件判断不清楚。原创 2024-05-01 12:47:45 · 39 阅读 · 0 评论 -
leetcode 第十四天 2024.3.27
将遍历到的代码放入队列中,并记录此层所有的节点个数为size,然后一个一个弹出,弹出的同时将这个节点的左右子节点都加入到队列中,弹出一个节点size减一,直到size为0,这时这一层的所有节点都已经弹出,然后我们重新获取size,此时的size就是下一层的所有节点个数。和上一道题基本思路一致,不用把每个节点都加入结果数组中,只需要判断当前节点是不是本层中最后一个节点,是最后一个节点将其加入到返回数组,不是则跳过。在将节点的左右子节点放入队列时忘记判断当前节点左右子节点是否存在。原创 2024-03-30 06:42:26 · 151 阅读 · 0 评论 -
leetcode 第十三天 2024.3.26
3.确定单层递归的逻辑。基本的思路是我们创建一个栈stack,然后往里放数据,再弹出,对于前序遍历,我们把根节点放进stack后把它弹出,然后关键就来了,如何往下进行,因为是前序我们最后的顺序需要是中左右,所以我们再弹出根节点后需要把右子节点压入stack中,然后再把左子节点压入栈中,下一次pop出来的就是我们上一个根节点的左子节点,然后对这个左子节点的右子节点压入栈中再压入这个左子节点的左子节点,周而复始。这里的前中后序指的是中这个节点的位置,前就在左右前面,后就在左右后面,放在左右对应的位置上.原创 2024-03-27 00:18:01 · 635 阅读 · 0 评论 -
leetcode 第十二天 2024.3.25
没有小顶堆和大顶堆的应用概念,大小顶堆都是二叉树的变体,大顶堆每个节点都比其左右子节点大,小顶堆每个节点都比其左右子节点小。这道题让返回前K个最大的,注意我们需要使用小顶堆,因为顶堆中push操作后需要pop(pop出的都是根节点),使用小顶堆可以确保每次push后pop弹出的都是当前堆中最小的,所以剩下的就是前K个最大的。sorted 可以对各种可迭代的对象进行排序,支持自定义排序的键(key)和排序方向(升序或降序)。这样,原本较大的值会变成较小的值,因此在最小堆中的顶部会是原始值中的最大值的负数。原创 2024-03-26 09:03:21 · 207 阅读 · 0 评论 -
leetcode 第十一天 2024.3.22
所以需要自己去定义单调队列,自己定义队列中的pop,push,以及查询方法我命名为lo。在定义队列时候,问题的难点是,pop和push方法,有两点值得注意,首先,要想到我们每次加入新的元素时,我们需要将单调队列中前面所有比这个新元素小的数都pop出去,换句话说,当新元素X进入队列时,我们将队列中所有<小于X的数都移除,这样我们就可以保证我们的队列中第一个数永远都是最大值,这也方便了我们的查询方法,我们只需要返回队列第一个元素就可以了。如果想到的话很简单。可以用list实现,也可以用deque来实现。原创 2024-03-23 02:42:40 · 396 阅读 · 0 评论 -
leetcode 第十天 2024.3.21
直接用双端列表进行操作,偷懒了,创建一个双端列表:d = deque(),双端列表中的操作:从右侧(尾部)添加一个元素 d.append(), 从左侧(头部)添加一个元素 d.appendleft(),从右侧(尾部)删除一个元素 d.pop(),从左侧(头部)删除一个元素 d.popleft()最后如果栈是空的就返回true,如果还有就返回false.想不到用栈来解决,想用dictionary,发现很难解决前后顺序问题。对这种实现方法类的题目还是不熟练,有些陌生。原创 2024-03-22 01:49:35 · 421 阅读 · 1 评论 -
leetcode 第八天 2024.3.12
不会join,举例result = ', '.join(my_list),result 就是把my_list中的元素用“,”连接了起来,my_list = ['Hello', 'World'],result =Hello, World.要想到移除元素步仅仅可以移除==val的元素,还可以把!=val的元素往前移动,一样可以达到题目中的要求。今天上午期中考,正好这几道题简单,浅做一下,准备出去玩了,明天打算整复习前面做过的题。list[开始索引:结束索引:步长]难点:python中的切片操作。原创 2024-03-13 06:33:49 · 326 阅读 · 1 评论 -
leetcode 第七天 2024.3.11
对于left和right的去重,我们需要在left < right的情况下操作。用i遍历整个数组,i在每次循环中都会是固定的,left = i +1, right在数组最末尾,当nums[i] + nums[left] + nums[right] > 0时,right往左移动,使得三数之和变小,nums[i] + nums[left] + nums[right] < 0 时left往右移动,使得三数之和变大。在找到一组解的时候,也要记得left ++,right--,去找在当前i 下剩余的所有解。原创 2024-03-12 00:58:30 · 410 阅读 · 1 评论 -
leetcode 第五天 2024.3.9
例如,链表A为0 1 2 3 4 5 6, B为 a b 4 c d, 链表A,B同时遍历,B先到尾部d,让B从A的开头0继续遍历,当A到A的6时候,这是B此时在A的1,A接着B的开头a继续遍历,然后就是 A-a, B-2 A-B, B-3 A-4, B-4找到了交点。这样AB的总长度就一样了,遍历既可以找到交点。= curb,然后里面if用的cura,而不用cura.next,因为当cura在链表尾部是,它自己已经是none了,用cura.next遍历不到none,从而会一致循环。原创 2024-03-10 08:55:35 · 817 阅读 · 1 评论 -
leetcode 第四天 2024.3.8
在定义实例方法时第一个参数通常定义为self,这样可以实现,在这个类中其他方法调用另一个属性或者方法是用self.就可以了. 注意,在本道题中,我们在添加或者删除某个特定节点的时候,比如说我们要删除 index=x 的节点或者在其前面添加一个新节点,我们要找的是x节点前一个节点y,然后把y.next 变成y.next.next 实现删除x,y.next = newnode实现添加。但可能找倒数N会困扰,看思路详解但,,,,无论何时都要记住对一个特定节点进行操作的时候,应用条件:链表逻辑,双指针。原创 2024-03-09 10:42:24 · 610 阅读 · 1 评论 -
leetcode 第三天 2024.3.7
看到题的时候也想到了大致一样的方法,但是在想具体实现思路的时候卡壳,想完第一圈的填充后不知道第二圈怎么填充了,其实是没有想到可以找一对(startx,starty)来代表每一圈填充的起始位置,每次填充完一圈后更新(startx,starty),同时(startx,starty)在填充过程中也帮助我们遍历所填充行/列的起始和终止位置,其次就是看到这道题怕了,觉得写不出来,没有动手去一步一步认真分析,也没有尝试去找到一定规律,下次遇到循环次数多的题,往循环不变量上去想或许可以帮助.应用条件:循环不变量。原创 2024-03-08 13:16:09 · 736 阅读 · 1 评论 -
leetcode 第一天 2024.3.5
难点:想不到双指针个人错误:不会在不知道具体数的时候创建长度固定为n的数组,用 list = [float('inf')] * n 创建,原创 2024-03-06 12:08:04 · 391 阅读 · 1 评论 -
leetcode 第二天 2024.3.6
2.同时,在寻找最小长度时,当while条件不满足时,上一次循环已经将start += 1 了,在这次循环开始,end也 + 1 所以并不会出现问题,做题时候想不明白这个逻辑,导致对初始summ应该写在哪混淆,初始summ就定义在end循环开始前,虽然后面end增加后可能summ不为零,start也不为零,但并不影响,在内置while中summ小于target时,end会再增加,summ会在原来的基础上加nums中end这个数,直到summ再次大于target时,再对start进行操作判断.原创 2024-03-07 09:33:19 · 1026 阅读 · 1 评论