150:两数相加II

LeetCode 445 https://leetcode.cn/problems/add-two-numbers-ii/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 反转链表+两数相加。 时间复杂度:O(n),其中 n 为 l1 长度和 l2 长度的最大值。 空间复杂度:O(1)。返回值不计入。 ...

七月 15, 2025 · Cassius

149:正则表达式匹配

LeetCode 10 https://leetcode.cn/problems/regular-expression-matching/description/ 难度:困难 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 动态规划。dp[i][j]表示 s[..i]与 p[..j]是否能够匹配。 s[i]==p[j] 或者 p[j]==’.' 此时 dp[i][j] = dp[i-1][j-1] s[i]与 p[j]不匹配,并且 p[j] != ‘*’ 如果 2.1 不成立,并且 p[j]也不是通配符’*’,那没辙了,直接返回匹配失败。 s[i]与 p[j]虽然不匹配,但是 p[j] == ‘*’ 这就要分两种情况了,要看 p[j-1]和 s[i]是否匹配。 如果 p[j-1]和 s[i]不匹配,那’_‘只能把前元素 p[j-1]匹配成 0 个 如果 p[j-1]和 s[i]可以匹配,那’_‘就可以把前元素 p[j-1]匹配成 0 个,1 个,多个。 时间复杂度:O(mn),其中 m 和 n 分别是字符串 s 和 p 的长度。我们需要计算出所有的状态,并且每个状态在进行转移时的时间复杂度为 O(1)。 空间复杂度:O(mn),即为存储所有状态使用的空间。 ...

七月 15, 2025 · Cassius

148:青蛙跳台阶问题

LCR 127 https://leetcode.cn/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/description/ 难度:简单 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 跳台阶。 时间复杂度 O(n) : 计算 f(n) 需循环 n 次,每轮循环内计算操作使用 O(1) 。 空间复杂度 O(1) : 几个标志变量使用常数大小的额外空间。 ...

七月 15, 2025 · Cassius

147:验证回文串

LeetCode 125 https://leetcode.cn/problems/valid-palindrome/description/ 难度:简单 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 初始化一左一右两个指针 i=0,j=n−1。其中 n 是 s 的长度。 C++ 判断字符的常用函数如下: 1. 判断字符是否为数字:isdigit(c) 2. 判断字符是否为字母或数字:isalnum(c) 3. 判断字符是否为字母:isalpha(c) 4. 判断字符是否为大写字母:isupper(c) 5. 判断字符是否为小写字母:islower(c) 6. 将大写字母转换为小写:tolower(c) 7. 将小写字母转换为大写:toupper(c) 分类讨论: 如果 s[i] 既不是字母也不是数字,右移左指针,也就是把 i 加一。 如果 s[j] 既不是字母也不是数字,左移右指针,也就是把 j 减一。 否则,如果 s[i] 和 s[j] 转成小写后相等,那么把 i 加一,把 j 减一,继续判断。 否则,s 不是回文串,返回 false。 循环直到 i≥j 为止。最后返回 true。 时间复杂度:O(n),其中 n 是 s 的长度。 空间复杂度:O(1)。 ...

七月 15, 2025 · Cassius

146:分发糖果

LeetCode 135 https://leetcode.cn/problems/candy/description/ 难度:困难 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 两次遍历,先从左往右,再从右往左。 时间复杂度:O(n),其中 n 是孩子的数量。我们需要遍历两次数组以分别计算满足左规则或右规则的最少糖果数量。 空间复杂度:O(n),其中 n 是孩子的数量。我们需要保存所有的左规则对应的糖果数量。 ...

七月 15, 2025 · Cassius

145:删除二叉搜索树中的节点

LeetCode 450 https://leetcode.cn/problems/delete-node-in-a-bst/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ root 为空,代表未搜索到值为 key 的节点,返回空。 root.val>key,表示值为 key 的节点可能存在于 root 的左子树中,需要递归地在 root.left 调用 deleteNode,并返回 root。 root.val<key,表示值为 key 的节点可能存在于 root 的右子树中,需要递归地在 root.right 调用 deleteNode,并返回 root。 root.val=key,root 即为要删除的节点。此时要做的是删除 root,并将它的子树合并成一棵子树,保持有序性,并返回根节点。根据 root 的子树情况分成以下情况讨论: root 为叶子节点,没有子树。此时可以直接将它删除,即返回空。 root 只有左子树,没有右子树。此时可以将它的左子树作为新的子树,返回它的左子节点。 root 只有右子树,没有左子树。此时可以将它的右子树作为新的子树,返回它的右子节点。 root 有左右子树,这时可以将 root 的后继节点(比 root 大的最小节点,即它的右子树中的最小节点,记为 successor)作为新的根节点替代 root,并将 successor 从 root 的右子树中删除,使得在保持有序性的情况下合并左右子树。 简单证明,successor 位于 root 的右子树中,因此大于 root 的所有左子节点;successor 是 root 的右子树中的最小节点,因此小于 root 的右子树中的其他节点。以上两点保持了新子树的有序性。 在代码实现上,我们可以先寻找 successor,再删除它。successor 是 root 的右子树中的最小节点,可以先找到 root 的右子节点,再不停地往左子节点寻找,直到找到一个不存在左子节点的节点,这个节点即为 successor。然后递归地在 root.right 调用 deleteNode 来删除 successor。因为 successor 没有左子节点,因此这一步递归调用不会再次步入这一种情况。然后将 successor 更新为新的 root 并返回。 时间复杂度:O(n),其中 n 为 root 的节点个数。最差情况下,寻找和删除 successor 各需要遍历一次树。 空间复杂度:O(n),其中 n 为 root 的节点个数。递归的深度最深为 O(n)。 ...

七月 15, 2025 · Cassius

144:矩阵中的最长递增路径

LeetCode 329 https://leetcode.cn/problems/longest-increasing-path-in-a-matrix/description/ 难度:困难 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 本题为记忆化 DFS。使用 memo[i][j] 维护以 matrix[i][j] 为起点的最长递增路径的长度。 时间复杂度:O(mn),其中 m 和 n 分别是矩阵的行数和列数。深度优先搜索的时间复杂度是 O(V+E),其中 V 是节点数,E 是边数。在矩阵中,O(V)=O(mn),O(E)≈O(4mn)=O(mn)。 空间复杂度:O(mn),其中 m 和 n 分别是矩阵的行数和列数。空间复杂度主要取决于缓存和递归调用深度,缓存的空间复杂度是 O(mn),递归调用深度不会超过 mn。 ...

七月 15, 2025 · Cassius

143:数组中重复的数据

LeetCode 442 https://leetcode.cn/problems/find-all-duplicates-in-an-array/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 对于数组大小和数据范围基本相同的题目,考虑原地哈希。 交换元素到其应到的位置,最后不在正确位置的元素说明重复。 时间复杂度:O(n)。每一次交换操作会使得至少一个元素被交换到对应的正确位置,因此交换的次数为 O(n),总时间复杂度为 O(n)。 空间复杂度:O(1)。返回值不计入空间复杂度。 ...

七月 15, 2025 · Cassius

142:连续子数组的最大和

LCR 161 https://leetcode.cn/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/description/ 难度:简单 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 本题与 LeetCode 53 相同。 这里使用动态规划方法。 f[i + 1] = max(f[i], 0) + sales[i]。 时间复杂度:O(n),其中 n 为 sales 数组的长度。我们只需要遍历一遍数组即可求得答案。 空间复杂度:O(n)。我们只需要常数空间存放若干变量。 ...

七月 15, 2025 · Cassius

141:解码方法

LeetCode 91 https://leetcode.cn/problems/decode-ways/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 这是划分型 DP 中的最优划分问题。 计算最少(最多)可以划分出多少段、最优划分得分等。 一般定义 f[i] 表示长为 i 的前缀 a[:i] 在题目约束下,分割出的最少(最多)子数组个数(或者定义成分割方案数)。 枚举最后一个子数组的左端点 L,从 f[L] 转移到 f[i],并考虑 a[L:i] 对最优解的影响。 本题类似爬楼梯,只是 f[i - 2] 需要判定。 时间复杂度:O(n),其中 n 是字符串 s 的长度。 空间复杂度:O(n) 或 O(1)。如果使用数组进行状态转移,空间复杂度为 O(n);如果仅使用三个变量,空间复杂度为 O(1)。 ...

七月 15, 2025 · Cassius