Leetcode
文章平均质量分 65
算法训练可以总结为一句话:回忆相似题。
解题如果没有相关的知识或者很少,要产生一个好思路是困难的。而好的思路来源于过去的经验和以前获得的知识。
Debroon
喜欢研究思维策略、动力策略、AI应用、各种新变化,让自己越来越自由。
展开
-
Leetcode题解索引
Leetcode文章目录Leetcode简单中等困难其他题解 简单[1].俩数之和[7].整数反转[9].回文数[13].罗马数字转整数[14].最长公共前缀[20].有效的括号[21].合并两个有序链表[26].删除排序数组中的重复项[27].移除元素[53].最大子序和[121].买卖股票的最佳时机[......原创 2020-04-26 08:18:01 · 930 阅读 · 1 评论 -
根到叶路径问题:遍历框架 + 前中后序位置 + 路径记录 + 叶子节点处理
遇到叶子节点时,将累加得到的数字加到总和中。整个逻辑链条是:DFS允许我们从根节点开始,深入每个分支,直到到达叶子节点,然后保存路径,并回溯删除已添加的结果路径,探索其他分支。当探索完一个节点的所有子节点后,我们需要回溯以探索同一父节点的其他子节点(如果有的话),这时当前节点不应该出现在新的路径中。:在完成了当前节点的所有子节点的遍历后(找到了一条路径),即在递归函数返回到父节点之前,我们应该从路径中移除当前节点。这时,我们需要把当前构建的路径保存起来,因为这条路径是完整的,从根节点到叶子节点的路径。原创 2024-03-12 11:14:37 · 1109 阅读 · 0 评论 -
98. 验证二叉搜索树 = 中序遍历验证递增性 + 递归验证节点与其直接父节点的关系 + 全局范围限制验证节点与所有祖先的正确位置
通过为每个节点设定一个最小值和最大值范围(这个范围由该节点到根节点路径上的所有祖先节点决定),全局范围限制确保了节点不仅与其直接父节点保持正确的关系,而且与其所有的左侧祖先和右侧祖先保持正确的关系。:在一个有效的二叉搜索树中,对于任何节点,其左子树中的所有节点的值都小于该节点的值,而其右子树中的所有节点的值都大于该节点的值。对于BST来说,这种遍历方法将按照节点值的递增顺序访问每个节点。确保整棵树遵循BST的规则:任何节点的左子节点的值都必须小于该节点的值,任何节点的右子节点的值都必须大于该节点的值。原创 2024-03-02 14:49:51 · 1017 阅读 · 0 评论 -
160.相交链表
由于两个链表可能有不同的长度,且相交点之后的节点是完全重合的,我们需要对齐两个链表的长度,以确保在遍历过程中能够比较相同位置的节点。拼接链表并不是为了匹配上相交点,而是为了对齐两个链表的长度,以便在遍历过程中能够比较相同位置的节点。在这个例子中,链表 A 和链表 B 在节点 3 处相交,之后的节点 3 和节点 4 是完全重合的。这样,在遍历过程中,两个指针可以同时移动,比较相同位置的节点是否相等,以找到相交点。通过拼接链表,我们可以在后续的遍历中比较相同位置的节点。我们需要找到两个链表的相交节点。原创 2023-11-03 12:57:19 · 111 阅读 · 0 评论 -
876. 链表的中间结点
根据这个例子,我们可以看到,当链表长度为偶数时,slow 确实返回的是中间的第二个节点,即节点 4。:如果我们希望在链表长度为偶数时返回中间的第一个节点,可以进行相应的调整,例如让 fast 初始时指向链表的第二个节点,然后进行相同的遍历操作。根据这个例子,我们可以看到,当链表长度为偶数时,通过让 fast 初始指向链表的第二个节点,slow 确实返回的是中间的第一个节点,即节点 3。当 slow 初始指向链表的头节点,fast 初始指向链表的第二个节点时,slow 每次移动一步,fast 每次移动两步。原创 2023-11-03 09:41:37 · 87 阅读 · 0 评论 -
23. 合并 K 个升序链表
无需每次更新最小节点的指针:在之前的方法中,通过遍历K个链表并比较节点值,确定最小节点后需要更新该链表的指针。而在最小堆的方法中,只需将最小节点的下一个节点加入优先级队列,无需显式更新指针。减少比较次数:在每次循环中,只需从优先级队列中取出最小节点,而不是遍历K个链表进行比较。维护一个最小节点的指针和对应的链表索引,依次选择最小的节点进行合并。把链表节点放入一个最小堆,就可以每次获得 k 个节点中的最小节点。通过不断更新最小节点和链表指针,最终完成K个有序链表的合并。这样可以减少比较的次数,提高效率。原创 2023-10-31 10:18:37 · 75 阅读 · 0 评论 -
86. 分隔链表
把原链表分为俩个链表,smlDummy 放小于 x 的元素, bigDummy 放大于 x 的元素。具体实现用了俩个头节点。他为什么用这个解法?原创 2023-10-31 09:38:46 · 97 阅读 · 0 评论 -
1726. 同积元组
继续遍历数组 nums,当 a = 3,b = 4 时,计算乘积 prod = a * b = 3 * 4 = 12。继续遍历数组 nums,当 a = 2,b = 6 时,计算乘积 prod = a * b = 2 * 6 = 12。继续遍历数组 nums,当 a = 4,b = 6 时,计算乘积 prod = a * b = 4 * 6 = 24。继续遍历数组 nums,当 a = 2,b = 4 时,计算乘积 prod = a * b = 2 * 4 = 8。最终,返回结果 result = 8。原创 2023-10-19 11:45:55 · 112 阅读 · 0 评论 -
2530. 执行 K 次操作后的最大分数
在使用最大堆或最小堆实现优先队列时,通常会将优先级较高的元素放在堆的顶部,即根节点。这样,当我们需要访问具有最高优先级的元素时,可以通过查看堆的根节点来获得。最大堆是一个完全二叉树,其中父节点的值大于或等于其子节点的值。贪心是行的通,我们只需要寻找最大值,但是我们是从头到尾遍历,又因为数组是动态变化的,我们得每次都从头遍历。第一思路,就是贪心,选出当前最大的那个元素,更新数组,继续选出最大,循环 k 次。看到给的算例,k=100000,数组元素鼠标滚动半分钟还没到一半,真的好多。比如战斗力排名前十的玩家。原创 2023-10-18 14:45:41 · 142 阅读 · 0 评论 -
2652. 倍数求和
因此,我们可以计算:10 + 15 + 8 - (猫 & 狗的数量) - (狗 & 兔子的数量) - (猫 & 狗 & 兔子的数量) = 1只动物。这个题目和答案是乱写的,主要看题目特征和方法的匹配 — 之所以使用 xx方法(容斥原理),是因为题目有 xx 特征。举个例子,当我们想要计算一共有多少只动物,但有些动物同时属于几个类别,我们可以使用容斥原理。通过应用容斥原理,我们得到了正确的结果,即一共有1只动物,避免了重复计数的问题。我们希望计算在给定范围内满足这些条件的数的总数,同时避免重复计数。原创 2023-10-17 10:04:05 · 229 阅读 · 0 评论 -
前缀和 & 技巧小记
比如计算 nums[1,4] 元素和 = preSum[5] - preSum[1].前缀和适用于快速、频繁地计算一个索引区间内的元素之和。在 nums 中寻找和为 target 的子数组。二维数组的子矩阵的元素之和,也能使用前缀和。但放在别的程序,往往需要多次计算区间。可以借助哈希表减少一个循环。原创 2023-05-01 10:07:29 · 620 阅读 · 0 评论 -
数组和双指针框架
快指针fast从数组第一个元素遍历到数组的最后一个元素,当快指针找到的不是需要删除的值,就把fast的值赋予slow(没被删除的元素添加到最终结果),并且slow指向下一个元素,最后 slow 就是需要的结果。快指针fast从数组第一个元素遍历到数组的最后一个元素,当快指针找到和慢指针不重复的值,就把fast的值赋予slow(不重复的数组添加到最终结果),并且slow指向下一个元素,最后 slow 就是需要的结果。左右指针实现的二分查找,能缩减一维有序数组的搜索空间,每次排除一半的元素来减少比较的次数。原创 2023-03-15 13:29:44 · 234 阅读 · 0 评论 -
89. 格雷编码
序列是符合要求的,唯一不同就是拼接地方不同,序列1最后010和序列2开头100有俩位不同。只变化1位就是倒序拼接,因为2和6不同就是加了4,二进制上也就是多了一个1(第1位加1)算例给了 n=2 的解,有了 n = 2 的解,推导怎么得到 n = 3 的解。n=4,5,6 原问题 = n-1的子问题 + 2^(n-1) + 倒序拼接。然后你写一个for循环,计算从1到n的所有格雷码,添加到答案数组。n = 2 算例答案:00 01 11 10(0-1-3-2)n = 2,值范围是 0-3。原创 2023-02-25 16:27:05 · 274 阅读 · 0 评论 -
2049. 统计最高分的节点数目
删除某个节点之后,最多会把二叉树分割成 三个部分 :左子树、右子树、父节点及父节点的另一半子树(除自己外其他节点个数)。一是,需要清晰左子树节点数、右子树节点数,再通过总数 - 左右子树数 - 1,得到除自己外其他节点数。最终表达式:一个节点的分数 = 左子树节点数 × 右子树节点数 × (总数 - 左右子树数 - 1)一个节点的分数 = 左子树节点数 × 右子树节点数 × 除自己外其他节点数。一个节点的分数 = 左子树节点数 × 右子树节点数 × 除自己外其他节点数。这题的核心是计算分数。原创 2023-02-19 14:19:44 · 336 阅读 · 0 评论 -
110. 平衡二叉树
要比较左右子树的高度,就不能通过前序位置一棵二叉树沿途得出,而是通过后序位置,遍历完整棵树,对比俩者高度差。原创 2023-02-19 08:32:31 · 94 阅读 · 0 评论 -
124. 二叉树中的最大路径和
【代码】124. 二叉树中的最大路径和。原创 2023-02-10 19:25:03 · 128 阅读 · 0 评论 -
951. 翻转等价二叉树
俩棵二叉树是否相同 = 俩棵树的根节点相同 && (俩个根节点的左右子树是否相同 || 翻转后, 俩个根节点的左右子树是否相同)。对子树把翻转和不翻转两种情况全都穷举一遍,只要有一种情况能够匹配,就说明整棵树是翻转相同的。二叉树原问题 = 根节点 + 左右子树问题。原创 2023-02-10 18:49:42 · 206 阅读 · 1 评论 -
101. 对称二叉树
俩棵子树是否对称 = 当前节点相同 + 左右子树相同。二叉树原问题 = 根节点 + 左右子树的子问题。原创 2023-02-10 18:34:53 · 107 阅读 · 0 评论 -
100. 相同的树
判断两棵树是否相同 = 判断根节点是否相同 && 左右子树的节点是否都相同。二叉树原问题 = 跟节点 + 左右子树。原创 2023-02-10 17:59:15 · 147 阅读 · 1 评论 -
95. 不同的二叉搜索树 II
根节点的子问题:循环历遍每一个元素,以这个元素作为根节点。二叉树子问题分解 = 根节点 + 左右子树的子问题。左子树的子问题:左子树的所有可行的集合。右子树的子问题:右子树的所有可行的集合。原创 2023-02-09 12:31:02 · 406 阅读 · 0 评论 -
链表和双指针框架
这样操作比较别扭且容易出错,而且力扣主要是考算法设计,C++语言特性的二级指针、创建额外的哨兵节点都不能用。单链表的操作难点在于,缺了指向前一个节点的指针,而链表删除结点是通过待删除结点的前一个结点。,从指向【当前节点】改成指向【前一个节点】,这样就有了指向前一个节点的指针。我们寻找一种更通用的设计方法,这称为‘【链表和双指针遍历框架】。当删除链表结点时,既需要访问当前结点,也需要访问前一个结点。这样两个指针的语义明确,也让你写出的代码更易理解。力扣的链表问题,基本都是单链表。在力扣里,是让遍历的指针。原创 2023-02-06 10:35:16 · 485 阅读 · 0 评论 -
998. 最大二叉树 II
【代码】998. 最大二叉树 II。原创 2023-02-03 16:22:46 · 131 阅读 · 0 评论 -
894. 所有可能的真二叉树
【代码】894. 所有可能的真二叉树。原创 2023-02-03 15:58:17 · 213 阅读 · 0 评论 -
331. 验证二叉树的前序序列化
二叉树的总入度等于总出度,也等于边数。二叉树本来就是图,看成有向图。原创 2023-02-03 13:37:43 · 117 阅读 · 0 评论 -
106. 从中序与后序遍历序列构造二叉树
构造二叉树,第一件事一定是找根节点,再构造左右子树。原创 2023-02-03 09:08:59 · 94 阅读 · 0 评论 -
889. 根据前序和后序遍历构造二叉树
【代码】889. 根据前序和后序遍历构造二叉树。原创 2023-02-01 22:29:54 · 258 阅读 · 3 评论 -
105. 从前序与中序遍历序列构造二叉树
所以我们只需要根据先序遍历得到根节点,然后在中序遍历中找到根节点的位置,它的左边就是左子树的节点,右边就是右子树的节点。前序遍历的特点是, 根节点出现在数组的第一位,而中序遍历中根节点出现在数组的中间位置。构造二叉树,第一件事一定是找根节点,然后想办法构造左右子树。生成左子树和右子树就可以递归的进行了。原创 2023-02-01 16:35:14 · 107 阅读 · 0 评论 -
1367. 二叉树中的链表
遍历二叉树套遍历二叉树,在每个节点尝试是否能形成一个链表。原创 2023-01-31 16:25:04 · 120 阅读 · 0 评论 -
572. 另一棵树的子树
遍历以 root 为根的这棵二叉树的所有节点,判断以该节点为根的子树是否和以 subRoot 为根的那棵树相同。原创 2023-01-31 12:51:47 · 93 阅读 · 0 评论 -
1261. 在受污染的二叉树中查找元素
由于节点的个数规模不算大,所以可以直接用一个 HashSet 缓存所有节点值,帮助 find 函数快速判断。还原二叉树的时候只需要遍历所有节点,通过函数参数传递每个节点的值。原创 2023-01-31 12:33:21 · 100 阅读 · 0 评论 -
513. 找树左下角的值
更简洁的视角是,遍历二叉树是先递归左子树,后递归右子树,所以到最大深度时第一次遇到的节点就是左下角的节点。,目标节点即最大行,最小列。如果给根节点坐标标记为。原创 2023-01-31 12:16:34 · 100 阅读 · 0 评论 -
437. 路径总和 III
枚举每个节点和TA的子节点,看能不能组成路径和。把二叉树看做是数组,利用前后序遍历来维护前缀和。可优化一下,使用前缀和。原创 2023-01-31 11:41:02 · 97 阅读 · 0 评论 -
1448. 统计二叉树中好节点的数目
则可 root 是「好节点」,再把 pathMax 传递到子树中继续判断其他节点。记录从根节点到当前节点路径中的最大值,如果。原创 2023-01-30 22:00:35 · 90 阅读 · 0 评论 -
1315. 祖父节点值为偶数的节点和
遍历二叉树,记录祖父节点,祖父节点是偶数,累加当前节点。或者,对于节点值为偶数的节点,累加它的孙子节点的值即可。原创 2023-01-30 19:08:28 · 162 阅读 · 1 评论 -
993. 二叉树的堂兄弟节点
遍历找到 x,y 的深度和父节点,对比即可。原创 2023-01-30 18:41:25 · 121 阅读 · 0 评论 -
987. 二叉树的垂序遍历
把这些坐标收集起来,依据题目要求进行排序,再组装成题目要求的返回数据格式。所以,需要先给每个节点标上坐标。因为返回顺序是,按列的。原创 2023-01-30 17:13:54 · 102 阅读 · 0 评论 -
623. 在二叉树中增加一行
遍历到对应行,进行插入即可。原创 2023-01-29 21:17:46 · 105 阅读 · 0 评论 -
617. 合并二叉树
虽然输入的是两棵树的根节点,但操作是同步的,可以看做在遍历一棵二叉树。遍历的过程中,将两棵二叉树的每个节点合并。原创 2023-01-29 19:32:55 · 83 阅读 · 0 评论 -
404. 左叶子之和
遍历一遍二叉树,找到左叶子节点,累加值。原创 2023-01-29 18:13:43 · 129 阅读 · 2 评论 -
1457. 二叉树中的伪回文路径
如 [1, 2, 1]、[2, 1, 1]、[2, 3, 3]、[3, 2, 3]。一个数字出现的次数为奇数,剩余数字的出现次数均为偶数,这组数字组成一个回文串。如果想要构成伪回文串,路径上的至多只能有。如何判断一组数字是否存在一个回文串组合?个奇数数字存在,其他数字都必须是偶数。个数字出现次数是奇数还是偶数,用。个数字出现是奇数还是偶数。规律是:一组数字中,原创 2023-01-29 15:54:50 · 373 阅读 · 0 评论