
LeetCodeHot100
文章平均质量分 89
Hello_Git
这个作者很懒,什么都没留下…
展开
-
19-链表-删除链表的倒数第 N 个结点
0 : val);说明val:节点的值,如果没有提供则默认为0。next:指向下一个节点的引用,如果没有提供则默认为null。通过上述详细的步骤和解释,相信你已经对使用双指针技术删除链表的倒数第 n 个节点的算法有了深入的理解。重要的是理解每一步指针的移动和为什么需要虚拟头结点,这些都是解决类似链表问题的关键。如果你在理解过程中有任何疑问,请随时提问,我会进一步解释和帮助你掌握这些概念。// 1. 快指针先移动 n 步// 2. 同时移动快慢指针,直到快指针到达末尾== null) {原创 2024-11-03 23:06:19 · 683 阅读 · 0 评论 -
21-链表-合并两个有序链表
回到当前的问题,我们需要将两个升序链表合并成一个新的升序链表。因为如果一个链表为空,剩下的链表已经是有序的了,不需要再比较。在实际应用中,如果链表很长,递归可能会导致栈溢出,这时候可以考虑使用迭代的方式来实现合并。最终,合并后的链表是:1 -> 2 -> 3 -> 4 -> 5 -> 6。在上面的示例中,链表有三个节点,值分别为1、3和5,最后一个节点指向。,它们都是链表的头节点,返回一个新的链表的头节点。此时,剩下的非空链表已经是有序的,无需进一步处理。:每一次递归调用返回的是合并后的链表的头节点。原创 2024-11-03 22:37:35 · 1031 阅读 · 0 评论 -
142-链表-环形链表 II
通过使用快慢指针的方法,我们不仅能够检测出链表中是否存在环,还能有效地找到环的起始节点。这种方法时间复杂度为 O(n),空间复杂度为 O(1),非常高效。理解了这个算法后,你可以自信地解决链表中关于环检测和相关的问题。原创 2024-11-03 22:27:04 · 909 阅读 · 0 评论 -
141-链表-环形链表
哈希表方法:简单直观,适用于大多数编程语言中,但需要额外的空间来存储节点信息。快慢指针法:空间效率更高,仅使用常数级别的额外空间,但需要对指针移动和环的逻辑有深入的理解。在实际应用中,快慢指针法由于其空间优势,通常更受欢迎,特别是在处理大规模数据时。希望通过以上详细的解析,你能更好地理解链表环检测的两种方法以及其中涉及的算法思想和知识点。如果有任何疑问或需要进一步的解释,请随时提问!原创 2024-11-03 21:57:19 · 1039 阅读 · 0 评论 -
234-链表-回文链表
遍历链表:从头到尾依次访问每个节点。构造正序和逆序字符串:分别记录链表的值的正序和逆序。比较字符串:通过比较正序和逆序字符串,判断链表是否为回文。这种方法的时间复杂度是O(n),空间复杂度也是O(n),其中n是链表的长度。对于初学者来说,这种方法直观且易于理解,非常适合作为解决回文链表问题的入门方法。希望通过以上详细的解释,你能更好地理解这段代码的工作原理和背后的算法思想。如果你有任何疑问,欢迎继续提问!原创 2024-11-03 21:42:27 · 678 阅读 · 0 评论 -
206-链表-反转链表
单链表(Singly Linked List)是一种线性数据结构,由一系列节点组成。值(Value):存储具体的数据。指针(Next):指向链表中的下一个节点。例如,链表表示一个包含三个节点的单链表,其中1指向22指向33指向null(表示链表的结束)。尾递归和自递归是递归的两种形式,最大的区别在于递归调用的位置及其对调用栈的影响。理解这两者的区别可以帮助我们在编写递归算法时选择合适的方法,以提高效率和避免潜在的栈溢出问题。在实际编程中,选择哪种递归方式通常取决于具体问题的性质和所使用的编程语言的特点。原创 2024-11-03 20:51:37 · 1057 阅读 · 0 评论 -
160-链表-相交链表
问题描述给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。示例链表A: a1 → a2↘↗链表B: b1 → b2 → b3在这个例子中,两个链表在节点c1开始相交。关键点两个链表的相交是指它们在某个节点开始后,接下来的所有节点都是相同的(即它们共享相同的后续节点)。相交是基于节点的引用(指针)而不是节点的值。因此,即使两个节点的值相同,如果它们是不同的对象,它们也不被认为是相交的。链表长度计算。原创 2024-11-03 20:17:22 · 906 阅读 · 0 评论 -
74-搜索二维矩阵
通过以上分析,我们可以得出结论:该算法利用了矩阵的结构特性,有效地查找目标值。它的时间复杂度为 O(m + n),空间复杂度为 O(1),在性能上非常高效。如果你还有其他问题或需要进一步的解释,随时告诉我!原创 2024-11-02 22:37:52 · 970 阅读 · 0 评论 -
35-二分搜索-搜索插入位置
二分查找是一种在有序数组中查找某个特定元素的高效算法。其核心思想是通过反复将查找范围减半,直到找到目标或确定其应插入的位置。时间复杂度为 O(log n),因为每次操作都将查找范围减少一半,非常高效。通过上述详细的代码分析和示例演示,我们深入理解了如何在 JavaScript 中使用闭区间二分查找实现查找或插入的位置。二分查找凭借其高效的时间复杂度,非常适合处理大规模有序数据的查找问题。关键点回顾闭区间写法: 包含left和right,循环条件为。中点计算: 使用确保整数索引。调整查找范围。原创 2024-11-02 22:27:42 · 795 阅读 · 0 评论 -
二分搜索算法
二分搜索原创 2024-11-02 22:26:16 · 255 阅读 · 0 评论 -
139-动态规划-单词拆分
DFS是一种用于遍历或搜索树或图的算法。它沿着树的深度遍历,尽可能深地搜索每个分支。当遍历到一个节点时,它会探索该节点的每个分支,直到无法继续为止,然后回溯到上一个节点,继续探索其他分支。在这个问题中,我们可以将字符串s看作是一棵树的路径,每个分割点代表一个分支。我们的目标是找到一条从字符串开始到结束的路径,使得路径上的每一部分都是字典中的单词。// 成功拆分到字符串末尾i <= len;i++) {// 获取从start到i的子串// 如果prefix在字典中,并且剩余子串可以拆分。原创 2024-11-02 21:42:34 · 591 阅读 · 0 评论 -
322-完全背包-零钱兑换
动态规划适用于具有重叠子问题和最优子结构的问题。我们通过将问题分解为更小的子问题,保存这些子问题的结果,以避免重复计算,从而有效地解决复杂问题。在本题中,我们希望找到组成金额i所需的最少硬币数dp[i],通过利用已经计算出来的较小金额的结果来推导出更大的金额的结果。我们定义一个数组dp,其中dp[i]表示组成金额i所需的最少硬币数。dp[0] = 0,因为组成金额0不需要任何硬币。其他所有dp[i]初始为Infinity,表示暂时无法组成该金额。原创 2024-11-02 20:47:20 · 783 阅读 · 0 评论 -
494-背包-目标和
1 : 0;这是一个递归函数,用于计算在数组的前i个元素中,和为c的子集个数。原创 2024-11-02 20:29:33 · 606 阅读 · 0 评论 -
01背包问题
原创 2024-11-02 20:18:44 · 104 阅读 · 0 评论 -
279-动态规划-完全平方数
通过动态规划,我们将原问题拆解为一系列子问题,每个子问题的解都依赖于之前已经解决的子问题。这样不仅高效解决了问题,还避免了重复计算,适用于需要最优解的场景。原创 2024-11-02 19:52:24 · 791 阅读 · 0 评论 -
198-动态规划-打家劫舍
rob函数接收一个数组nums作为输入,表示每间房屋内的现金。题目:给定一个非负整数数组nums,表示每间房屋内的现金。小偷不能同时偷窃相邻的房屋。你的目标是计算小偷在不触发报警的情况下,能够偷窃到的最高金额。示例12(偷窃房屋 1 和 3 的现金,将得到 2 + 9 + 1 = 12)题目:给定一个非负整数数组nums,表示每间房屋内的现金。小偷不能同时偷窃相邻的房屋。你的目标是计算小偷在不触发报警的情况下,能够偷窃到的最高金额。示例12。原创 2024-11-02 17:51:19 · 769 阅读 · 0 评论 -
131-字符串-分割回文串
通过详细解析上述代码和算法思想,我们深入理解了如何使用回溯和深度优先搜索来解决字符串分割成回文子串的问题。递归探索:每一步选择一个可能的分割点,递归处理剩余的字符串。有效性检查:只有当子串是回文时,才继续深入,确保最终的分割方案满足条件。路径管理:通过path数组记录当前的分割路径,并在回溯时正确地恢复状态。在 JavaScript 中,使用和s[right]都是可以的,它们的功能是相同的,都是用来获取字符串s中索引为right的字符。不过,了解这两种方法的不同之处和各自的使用场景是有益的。原创 2024-11-02 17:06:52 · 1025 阅读 · 0 评论 -
17-回溯-电话号码的字母组合
题目:给定一个数字字符串digits,返回所有可能的字母组合。映射关系2 -> “abc”3 -> “def”4 -> “ghi”5 -> “jkl”6 -> “mno”8 -> “tuv”回溯算法是通过选择、约束和目标来系统地探索解空间的一种方法。在字母组合问题中,选择体现在数字到字母的映射,目标体现在指针的越界,而约束条件在此问题中没有明显的体现。这种算法的优势在于它能够有效地生成所有可能的组合,适用于许多组合和排列的相关问题。原创 2024-11-02 16:13:36 · 1017 阅读 · 0 评论 -
79-回溯-单词搜索
我们有一个m x n的二维字符网格board和一个字符串word。任务是确定word字母顺序:单词的字母必须按顺序连在一起。相邻单元格:路径只能在水平和垂直方向上移动(不包括对角线)。不重复使用单元格:同一个单元格不能被重复使用。和单词"SEE",答案是true,因为路径可以是。深度优先搜索(DFS):通过递归的方式深入搜索每一种可能的路径,直到找到匹配的路径或者无法继续。回溯(Backtracking):当某条路径无法继续匹配时,撤销当前选择,回到上一步尝试其他可能的选择。访问标记:使用used。原创 2024-11-02 16:10:27 · 992 阅读 · 0 评论 -
22-回溯-括号生成
给定一个数字n,表示需要生成n对括号,我们的目标是返回所有可能的有效括号组合。例如,如果n = 3((()))(()())(())()()(())()()()在这个过程中,回溯算法通过不断选择左括号和右括号,结合约束条件来确保生成的括号组合是有效的。通过剪枝,算法避免了无效路径的搜索,确保了效率。最终,所有合法的组合都被生成并收集到结果集中。原创 2024-11-02 15:43:15 · 987 阅读 · 0 评论 -
39-回溯-组合总和
给定一个无重复元素的整数数组candidates和一个目标整数target,我们需要找到所有和为target的组合。元素可以重复使用,但组合不能重复。选择控制:通过控制start索引来避免重复组合。终止条件:明确了何时加入结果集。撤销选择:通过temp.pop()恢复到上一步状态,以便尝试其他组合。你的复盘总结非常到位,清晰地概述了回溯算法的核心思想和步骤。为了进一步巩固你的理解,我们可以补充一些细节和实例,帮助你更好地掌握回溯的概念和应用。动态性。原创 2024-11-02 15:10:12 · 759 阅读 · 0 评论 -
78-回溯-子集
题目:给定一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。示例输入:nums = [1, 2, 3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]通过回溯算法,我们能够有效地生成一个数组的所有子集。选择与不选择的策略。通过递归深入探索所有可能的组合。使用回溯撤销选择,确保能够尝试所有选项。这种方法不仅适用于生成子集,还可以推广到其他组合、排列等问题。原创 2024-11-01 14:31:09 · 725 阅读 · 0 评论 -
46-回溯-全排列
题目:给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案。示例输入:nums = [1, 2, 3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]通过回溯算法,我们能够系统地探索所有可能的数字排列,而无需担心遗漏或重复。这种方法特别适用于需要生成所有组合或排列的问题。选择一个数字:尝试将其加入当前路径。递归探索:基于当前选择,继续探索下一步的选择。撤销选择。原创 2024-11-01 14:25:45 · 1182 阅读 · 0 评论 -
114-二叉树-二叉树展开为链表
通过这种递归的方法,我们可以有效地将二叉树展开为一个链表,且保持先序遍历的顺序。关键在于利用树的结构特性和递归的思想,逐步将每个节点的左子树转移到右边,同时正确连接所有节点的右指针。这样,我们既能保持代码的简洁性,又能确保性能的高效性。这种方法不仅适用于二叉树的展开,也可以推广到其他树结构的处理。好的,让我们通过你提供的二叉树示例,详细推导将其展开为单链表的过程。我们将使用先序遍历的方式来连接树的节点。原创 2024-10-31 22:58:01 · 856 阅读 · 0 评论 -
105-二叉树-从前序与中序遍历序列构造二叉树
通过前序遍历和中序遍历序列,可以唯一构建出一棵二叉树。确定根节点:前序遍历的第一个元素。划分子树:在中序遍历中找到根节点的位置,划分出左子树和右子树的遍历序列。递归构建:对左子树和右子树重复上述步骤,直到遍历序列为空。初始的实现方法简单直观,但在大规模数据下可能存在性能问题。通过使用哈希表优化,可以显著提升算法的效率,使其适用于更大规模的输入。我们将使用一个递归函数helper// 基线条件// ...二叉树遍历是指按照特定顺序访问二叉树中的所有节点。原创 2024-10-31 22:17:17 · 2387 阅读 · 0 评论 -
139-二叉树-二叉树的右视图
BFS 是一种用于遍历或搜索树或图的算法。它从根节点开始,首先访问该节点,然后逐层向下访问每一层的所有节点。实现 BFS 通常使用一个队列来辅助。你提供的这段代码是一种高效且简洁的广度优先搜索(BFS)实现方法,用于获取二叉树的右视图。通过使用两个数组cur和nxt,避免了在队列中频繁使用shift()操作,提高了性能。同时,逻辑清晰,易于理解和维护。原创 2024-10-31 19:57:49 · 823 阅读 · 0 评论 -
230-二叉树-二叉搜索树中第 K 小的元素
当然,我很高兴帮助你深入理解如何在二叉搜索树(BST)中查找第 k 小的元素。小的元素,可以在 BST 的基础上增强数据结构,例如在每个节点中维护子树的节点数量。为了确保最坏情况下的效率,可以使用平衡二叉搜索树(如 AVL 树、红黑树)。大元素的查找,可以实现双向中序遍历,即同时遍历升序和降序,进一步优化查询速度。因此,通过中序遍历,我们能以排序的顺序访问节点,自然可以轻松找到第。因此,通过中序遍历,我们可以按顺序访问元素,并在访问到第。让我们通过一个具体的例子,详细理解这个算法的执行过程。原创 2024-10-31 19:29:03 · 606 阅读 · 0 评论 -
108-二叉树-将有序数组转换为二叉搜索树
二叉搜索树左子树节点的值小于根节点的值。右子树节点的值大于根节点的值。左右子树也分别是二叉搜索树。这种结构使得查找、插入和删除操作在平均情况下具有较高的效率。平衡二叉搜索树是一种特殊的二叉搜索树,它在保持二叉搜索树有序性的同时,还满足平衡性条件,确保树的高度尽可能低,以保证操作的高效性。保持平衡:通过严格的平衡条件和旋转操作,确保树的高度始终保持在O(log n)级别。高效操作:由于高度有限,查找、插入和删除等操作的时间复杂度均为O(log n),即使在最坏情况下也能够保持较高的效率。结构复杂性。原创 2024-10-31 18:23:33 · 1107 阅读 · 0 评论 -
102-二叉树-二叉树的层序遍历
层序遍历是一种逐层访问二叉树节点的方法,即首先访问根节点,然后访问根节点的左右子节点,再访问这两节点的子节点,以此类推,直到所有节点都被访问。1/ \2 3/ \ \4 5 6[1],[2, 3],[4, 5, 6]你提供的代码使用了两个数组当前层数组 (cur:用于存储当前正在遍历的节点。下一层数组 (nxt:用于存储下一层将要遍历的节点。每完成一层的遍历后,将下一层数组赋值给当前层数组,继续遍历,直到所有层都被遍历完。你提供的两个数组方法是一种直观且有效的方式来实现二叉树的层序遍历。原创 2024-10-31 17:22:39 · 813 阅读 · 0 评论 -
543-二叉树-二叉树的直径
二叉树的直径是指树中任意两个节点之间最长路径的长度。路径的长度由路径上边的数量表示,而不是节点的数量。需要注意的是,这条最长路径可能会经过或不经过根节点。1/ \2 3/ \4 5在这棵树中,最长路径是,路径的长度为3(即有3条边)。递归是解决树形结构问题的强大工具通过递归,我们可以轻松地遍历树的每个节点,并在遍历过程中收集所需的信息(如深度、直径等)。全局变量用于跟踪全局状态在本问题中,使用全局变量ans来持续更新和跟踪最大直径。区分节点数量和路径长度直径是路径的长度,等于路径上边的数量。原创 2024-10-31 16:56:53 · 1006 阅读 · 0 评论 -
101-对称二叉树
轴对称二叉树是指一个二叉树在其中心轴上对称。也就是说,二叉树的左子树和右子树是镜像对称的。具体来说,对于每个节点,其左子树的结构和右子树的结构是互为镜像的。通过递归的方法,我们可以高效地检查一棵二叉树是否轴对称。关键在于定义清晰的镜像对称条件,并通过递归逐层验证每一对节点是否满足对称性。掌握这种递归思路对于解决类似的树结构问题非常有帮助。如果你有其他问题或需要进一步的解释,请随时告诉我!原创 2024-10-30 22:54:17 · 532 阅读 · 0 评论 -
226-二叉树-翻转二叉树
给定一个二叉树的根节点root,我们需要翻转这棵二叉树,并返回其根节点。对于每个节点,交换其左右子节点。递归地对每个子树进行相同的操作。原创 2024-10-30 21:45:19 · 807 阅读 · 0 评论 -
104-二叉树-二叉树的最大深度
最大深度是指从根节点到最远叶子节点的最长路径上的节点数。也就是说,我们需要找到从根节点到达叶子节点的路径中,节点的数量最多的那条路径。原创 2024-10-30 21:24:38 · 697 阅读 · 0 评论 -
94-二叉树-二叉树的中序遍历
二叉树(Binary Tree)是一种树形数据结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的每个节点都有一个值,并且可以通过指针或引用连接到其子节点。原创 2024-10-30 21:09:36 · 840 阅读 · 0 评论 -
118-动态规划-杨辉三角
通过这个代码,我们可以生成杨辉三角的前numRows行。每一行的计算依赖于上一行的结果,这展示了动态规划的特性:通过将大问题分解为小问题并利用之前的结果来构造最终解。如果你还有其他问题或需要进一步的解释,请随时告诉我!在 JavaScript 中,和都是用来创建一个长度为numRows的空数组的写法。它们的效果是相同的,都是生成一个指定长度的数组,但在语法上略有不同。原创 2024-10-30 20:31:05 · 1072 阅读 · 0 评论 -
70-动态规划-爬楼梯
动态规划是一种高效解决复杂问题的策略,通过将问题分解为更小的子问题并存储结果来避免重复计算。理解动态规划的核心在于识别重叠子问题和最优子结构,建立状态转移方程,并通过适当的初始化和计算步骤获得最终结果。如果你有任何具体问题或需要进一步的解释,请随时问我!原创 2024-10-30 20:20:57 · 652 阅读 · 0 评论 -
438-滑动窗口-找到字符串中所有字母异位词
给定两个字符串 和 ,我们需要找到 中所有 的异位词的子串,并返回这些子串的起始索引。异位词是指由相同字符组成的字符串,但字符的顺序可以不同。哈希表记录字符频率:滑动窗口:判断异位词:更新哈希表:下面是你提供的代码,并附上详细注释:代码逻辑分析初始化:构建哈希表:初始化窗口:滑动窗口:更新哈希表:让我们通过一个具体的例子来说明这个过程。过程细节初始化哈希表:初始化窗口:检查异位词:滑动窗口:继续滑动:找到下一个异位词:通过以上过程,最终得到的起始索引数组为 ,表示在 中的两个异位词子原创 2024-10-30 19:54:14 · 721 阅读 · 0 评论 -
15-三数之和
通过排序和双指针的方法,我们能够高效地找到所有和为零的不重复三元组。这种方法的关键在于利用排序来避免重复,并通过双指针来高效查找。希望这个详细的推理过程能够帮助你更好地理解这道题!如果你有其他问题或需要进一步的解释,请随时告诉我!好的,让我们逐步分析输入的过程,看看如何通过代码找到所有和为零的三元组。我们将详细解释每一步的计算和逻辑。不会遗漏:跳过重复的逻辑是为了避免重复三元组,而不是跳过所有可能的组合。每个元素的组合都被充分考虑。高效性:这种跳过策略提高了算法的效率,尤其是在处理大量重复元素时。原创 2024-10-30 18:37:11 · 676 阅读 · 0 评论 -
167-双指针-两数之和 II - 输入有序数组
我们来详细分析这个“两数之和”问题的解决方案。这个问题要求在一个已按非递减顺序排列的整数数组中找到两个数,使它们的和等于给定的目标值。我们将使用双指针的方法来高效地解决这个问题,并确保使用常量级的额外空间。返回这两个元素的下标,且下标从 1 开始。,需要找到两个不同的元素,使它们的和等于。给定一个已排序的数组。原创 2024-10-30 15:26:25 · 746 阅读 · 0 评论 -
11-贪心-双指针盛最多水的容器
在这个问题中,我们需要找到两个柱子(线段),使得它们与 x 轴形成的容器能够盛放最多的水。贪心策略的核心在于每一步都选择当前情况下能够获得最大容量的选项。我们来详细解析这个问题——寻找能够容纳最多水的两条线,以及如何使用双指针算法来解决这个问题。我们将逐步分析题目的要求、思路、实现以及代码的细节。,表示每条垂线的高度。我们需要找到两条垂线,使得它们与 x 轴共同构成的容器可以容纳最多的水。原创 2024-10-30 14:56:33 · 803 阅读 · 0 评论