036:最长公共子序列

LeetCode 1143 https://leetcode.cn/problems/longest-common-subsequence/description/ 难度:中等 LCS 线性 DP 问题,状态转移方程如下: if (s[i] == t[j]) { f[i + 1][j + 1] = f[i][j] + 1; } else { f[i + 1][j + 1] = max(f[i + 1][j], f[i][j + 1]); } 时间复杂度:O(nm)。 空间复杂度:O(nm)。 ...

六月 30, 2025 · Cassius

032:二叉树中的最大路径和

LeetCode 124 https://leetcode.cn/problems/binary-tree-maximum-path-sum/description/ 难度:困难 这道题是树形 DP 中的直径 DP。枚举直径拐弯的位置,在每一个拐弯的位置更新答案,将以当前节点为根的链的最大路径和返回给父节点,如果路径和为负数返回 0。 边界条件是空节点的路径和为 0。 需要注意的是,更新答案的是直接的路径和,而返回的是链的路径和。 时间复杂度:O(n),其中 n 为二叉树的节点个数。 空间复杂度:O(n)。最坏情况下,二叉树退化成一条链,递归需要 O(n) 的栈空间。 ...

六月 30, 2025 · Cassius

031:编辑距离

LeetCode 72 https://leetcode.cn/problems/edit-distance/description/ 难度:中等 这是线性 DP 的经典题目,类似 LeetCode 1143 最长公共子序列。 状态转移方程为: //word1[i] == word2[j] f[i + 1][j + 1] = f[i][j]; //word1[i] != word2[j] f[i + 1][j + 1] = min({f[i + 1][j], f[i][j + 1], f[i][j]}) + 1; 在不相等时,三种情况分别对应插入,删除,替换的情况。 此外,还要注意数组的初始化操作。 f[i + 1][0] = i + 1; f[0][j + 1] = j + 1; 时间复杂度:O(nm),其中 n 为 word1 的长度,m 为 word2 的长度。 空间复杂度:O(nm)。 ...

六月 29, 2025 · Cassius

024:最长上升子序列

LeetCode 300 https://leetcode.cn/problems/longest-increasing-subsequence/description/ 难度:中等 本题求最长上升子序列(LIS)有两种做法,分别是动态规划和贪心。 ...

六月 29, 2025 · Cassius

007:最大子数组和

LeetCode 53 https://leetcode.cn/problems/maximum-subarray/description/ 难度:中等 本题有两种做法,分别是前缀和以及动态规划。 前缀和的做法为维护最小前缀和,答案为当前前缀和减去最小前缀和。 动态规划的转移方程为 \(f[i] = max(f[i-1],0) + nums[i]\)。 时间复杂度:O(n),其中 n 为 nums 的长度。 空间复杂度:O(1)。仅用到若干额外变量。 ...

六月 27, 2025 · Cassius