- 博客(22)
- 收藏
- 关注
原创 leetcode -编辑距离
**插入**:`dp[i][j-1] + 1`(在 `word1` 末尾插入字符以匹配 `word2` 的第 `j` 个字符)。`dp[i][j]` 表示将 `word1` 的前 `i` 个字符转换成 `word2` 的前 `j` 个字符所需的最少操作数。- `dp[i][0] = i`:将 `word1` 的前 `i` 个字符删除为空字符串需要 `i` 次操作。- **删除**:`dp[i-1][j] + 1`(删除 `word1` 的第 `i` 个字符)。
2025-03-30 21:54:17
1029
原创 ### **Java基础学生管理系统实现详解**
**问题**:原代码中 `list.remove(list)` 错误,应改为 `list.remove(index)`。- **输入校验**:通过 `contains` 和 `getIndex` 方法确保ID唯一性。- 输入ID:`001` → 姓名:`张三` → 年龄:`18` → 地址:`北京`- `ArrayList` 的增删改查(`add`, `remove`, `get`)。- 输入ID:`001` → 修改姓名为`李四`,年龄`20`,地址`上海`
2025-03-29 00:02:35
391
原创 # 动态规划解决最长回文子序列问题
s[j]`,则 `dp[i][j] = max(dp[i+1][j], dp[i][j-1])`。若 `s[i] == s[j]`,则 `dp[i][j] = dp[i+1][j-1] + 2`。定义 `dp[i][j]` 表示字符串 `s` 的子串 `s[i...j]` 的最长回文子序列长度。(中间的 `dp[i+1][j-1]` 已经是回文,加上首尾两个相同字符,长度增加 2)- 所有长度为 1 的子串,`dp[i][i] = 1`(单个字符自身是回文)。// 单个字符的子串,回文长度为1。
2025-03-28 12:44:25
562
原创 # 动态规划解决单词拆分问题详解
输入:`s = "catsandog"`, `wordDict = ["cats", "dog", "sand", "and", "cat"]`- 示例1中的 `s = "leetcode"` 是一个连续字符串,需要被动态分割为 `"leet"` 和 `"code"`。// 读取字典中的单词。1. 假设 `s` 被分割为 `["cats", "and", "og"]`(但 `"og"` 不在字典中)。假设 `s` 被分割为 `n` 个单词,字典有 `m` 个单词,初始思路的时间复杂度为 `O(n*m)`。
2025-03-26 00:45:59
1031
原创 # 中心扩展法求解最长回文子串详解
例如,字符串 `"aba"` 的中心为 `i=1`,扩展后 `left=-1`,`right=3`,返回 `3 - (-1) - 1 = 3`。- **奇数长度回文**:长度为 `len`,中心为 `i`,则起始位置为 `i - (len-1)/2`,结束位置为 `i + len/2`。1. **遍历所有可能的中心点**:每个字符本身可以作为奇数长度回文的中心,每两个相邻字符可以作为偶数长度回文的中心。3. **更新最长回文的边界**:根据扩展后的回文长度,更新最长回文的起始和结束位置。
2025-03-24 20:06:28
1244
原创 # LeetCode题解:最大正方形面积
当 `i == 0` 或 `j == 0`(即第一行或第一列)时,若 `matrix[i][j]` 为 `'1'`,则 `dp[i][j] = 1`。- 若 `matrix[i][j]` 为 `'0'`,则 `dp[i][j] = 0`(无法构成正方形)。在一个由 `'0'` 和 `'1'` 组成的二维矩阵中,找到只包含 `'1'` 的最大正方形,并返回其面积。- 定义 `dp[i][j]` 表示以 `(i, j)` 为右下角的最大正方形的边长。**解释**:整个矩阵构成一个3x3的正方形,面积为9。
2025-03-24 04:26:32
1437
原创 ### Java二维字符矩阵输入解析:正确读取由0和1组成的矩阵
若某行字符串长度不等于`n`,例如输入`101`但`n=5`,会抛出`StringIndexOutOfBoundsException`。此时必须调用`sc.nextLine()`**显式跳过这个换行符**,否则后续读取的`line`可能为空字符串,导致逻辑错误。使用`sc.nextInt()`读取`m`和`n`时,输入流中会残留换行符(用户输入`4 5`后按下的回车)。**解决方案**:在读取`m`和`n`后,立即调用`sc.nextLine()`。1. **读取行列数后的换行符处理**
2025-03-22 17:50:06
828
原创 ### 解决《下降路径最小和》问题详解
给定一个 `n x n` 的方形整数数组 `matrix`,找到从第一行任意元素开始,每一步移动到下一行相邻列(正下方、左下或右下)的路径,使得路径和最小。**动态规划**:从倒数第二行开始逐层向上计算每个位置的最小路径和。- **数组越界**:处理列边界时需用三元运算符严谨判断,避免访问 `j-1` 或 `j+1` 越界。通过逐层递推和合理处理边界,能够高效求解下降路径的最小和。- **时间复杂度**:O(n²),遍历每个元素一次。- **空间复杂度**:O(1),直接在原数组上修改。
2025-03-21 10:27:52
702
原创 # 动态规划求解三角形最小路径和
*解释**:路径为 `2 → 3 → 5 → 1`,总和为 `2 + 3 + 5 + 1 = 11`。2. **状态转移**:每个节点的值等于其自身加上下一行相邻两个节点的较小值。- **时间复杂度**:O(n²),其中 n 是行数。- **空间复杂度**:O(1),直接在原数据结构上修改,无需额外空间。4. **遍历方向**:从倒数第二行开始,逐层向上更新节点的值。1. **状态定义**:从当前位置到底部的最小路径和。**解释**:路径为 `1 → 2`,总和为 `3`。**输出**:`11`
2025-03-20 19:38:11
796
原创 ### 深入解析:如何构建三角形并求解自顶向下的最小路径和 的基础—(构建三角形)
**`sc.nextLine()` 的作用**:`nextInt()` 读取输入后不会读取行末的换行符,需要用 `sc.nextLine()` 清除缓冲区。例如,输入 `" 6 5 7 "` 会被分割为 `["6", "5", "7"]`。`\\s+` 可以匹配**一个或多个连续空格**,避免空字符串(例如输入 `"3 4"` 会被正确分割为 `["3", "4"]`)。`printf` 通过格式说明符(如 `%d`, `%s`, `%f`)定义变量的输出格式。
2025-03-18 11:57:05
900
原创 ## 三篇动态规划系列博客的联系与解题方法递进
第二篇的状态转移方程 `dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]` 与第三篇的 `dp[i][j] = dp[i-1][j] + dp[i][j-1]` 结构相似,仅目标不同(最小值 vs 累加和)。- 第二篇中,第一行的初始化需要从左到右累加 `grid` 的值(`dp[0][j] = dp[0][j-1] + grid[0][j]`),而第三篇的初始化更简单(直接赋 `1`)。这为第三篇的路径数目问题(同样无障碍物)提供了简化思路。
2025-03-15 16:49:32
405
原创 ## 两篇动态规划博客的联系与解题方法递进
第一篇的状态转移方程 `max(dp[i-1], dp[i-2] + value[i])` 体现了 **条件选择逻辑**(选或不选当前元素)。- 类似地,在机器人路径问题中,若某个格子是障碍物(`grid[i][j] = 1`),则直接标记 `dp[i][j] = 0`。- 这一逻辑在机器人路径问题中演变为 **条件路径累加**:若当前格子无障碍物,则累加上方和左方的路径数。- **第二篇(机器人路径问题)**:属于二维动态规划问题,需处理网格中的障碍物和路径选择。
2025-03-15 16:44:29
399
原创 ## 六篇动态规划系列博客的联系与解题方法递进
状态转移方程变为 `dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])`,需要同时考虑路径选择和成本累加。- 斐波那契数的动态规划框架为泰波那契数提供了基础模板,只需将状态转移方程扩展为 `dp[i] = dp[i-1] + dp[i-2] + dp[i-3]`。- 例如,爬楼梯的状态转移方程 `dp[i] = dp[i-1] + dp[i-2]` 直接对应斐波那契数的递推公式。
2025-03-15 16:40:22
556
原创 # 机器人不同路径数目的动态规划解法
否则,`dp[i][j] = dp[i-1][j] + dp[i][j-1]`(来自上方或左方的路径数之和)。// 初始化第一行:从左到右,若当前是障碍物则路径数为 0,否则继承左侧的值。// 初始化第一列:从上到下,若当前是障碍物则路径数为 0,否则继承上方的值。- **初始化错误**:未正确处理第一行和第一列中间的障碍物,导致后续路径数错误累计。- **障碍物判断遗漏**:未在动态规划过程中跳过障碍物。- **边界条件**:未检查起点或终点是否为障碍物。- 起点或终点是障碍物时,直接返回 0。
2025-03-15 16:31:06
1108
原创 # 动态规划解决最小路径和问题:从错误中学习正确解法
2. **初始化**:起点的值 `dp[0][0] = grid[0][0]`。5. **边界条件处理**:当 `m=0` 或 `n=0` 时需单独处理(题目中网格为非负整数,但实际可能需要返回0)。应使用 `n`(列数)作为循环条件。1. **定义状态**:`dp[i][j]` 表示从左上角到 `(i,j)` 位置的最小路径和。1. **起点未初始化**:必须显式设置 `dp[0][0] = grid[0][0]`。// 正确应为:dp[i][0] = dp[i-1][0] + nums[i][0];
2025-03-14 12:49:50
1124
原创 ### **动态规划解决机器人路径问题详解*
使用一维数组时,`dp[j]` 在更新前存储的是上一行的数据(即 `dp[i-1][j]`),而 `dp[j-1]` 是当前行已经更新过的左侧数据(即 `dp[i][j-1]`)。`m=1` 且 `n=1` 时,外层循环不会执行(`i` 从 `1` 开始,但 `m=1` 不满足循环条件),直接返回 `dp[0] = 1`。- 二维数组中 `dp[i][j]` 的值由 `dp[i-1][j]`(正上方)和 `dp[i][j-1]`(左侧)决定。
2025-03-13 18:16:24
827
原创 ## 多种解法详解:删除并获得点数问题
1. **统计总和**:将每个数字及其总点数存入数组 `sum`,`sum[i]` 表示数字 `i` 的总点数。- **解法二**:哈希表统计后排序为 `[2,3,4]`,依次处理得到最大值 `6`。- **解法二**:排序后处理 `[2,3,4]`,跳过相邻的 `4`,总和为 `9`。- **解法一**:`sum = [0,0,2,3,4]`,动态规划结果为 `6`。- **解法一**:`sum = [0,0,4,9,4]`,动态规划结果为 `9`。**示例1**:`nums = [3,4,2]`
2025-03-12 22:21:49
972
原创 # 打家劫舍问题详解:动态规划、空间优化及其他方法
将数组的每个元素都填充为 -1 ,最后通过增强型 for 循环输出数组元素,结果会是 -1 -1 -1 -1 -1。由于 `dp[i]` 只依赖前两个状态(`dp[i-1]` 和 `dp[i-2]`),可以用两个变量代替数组,将空间复杂度优化到 O(1)。若偷第 `i` 个房屋,则不能偷第 `i-1` 个房屋,此时金额为 `dp[i-2] + nums[i]`;- **状态定义**:`dp[i]` 表示偷到第 `i` 个房屋时能获得的最大金额。- **递归法**仅适用于理解问题,实际应用中需避免。
2025-03-11 16:46:53
707
原创 # LeetCode 746. 使用最小花费爬楼梯:动态规划详解
给你一个整数数组 `cost`,其中 `cost[i]` 是从楼梯第 `i` 个台阶向上爬需要支付的费用。输入:`cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]`输入:`cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]`- **空间复杂度**:`O(n)`,使用长度为 `n+1` 的数组保存状态。- `dp[0] = 0`:从下标 `0` 出发不需要费用。- `dp[1] = 0`:从下标 `1` 出发不需要费用。
2025-03-10 22:18:11
481
原创 # 1137. 第 N 个泰波那契数:递归与迭代解法详解
\( i = 3 \):`next = 0 + 1 + 1 = 2` → 更新 `a=1`, `b=1`, `c=2`| 递归法 | \( O(3^n) \) | \( O(n) \) | 仅限极小 \( n \) |- **时间复杂度**:\( O(3^n) \),每次递归会调用三次自身,导致指数级时间增长。| 迭代法 | \( O(n) \) | \( O(1) \) | 所有 \( n \) |- **空间复杂度**:\( O(n) \),递归深度为 \( n \),存在栈溢出风险。
2025-03-10 21:51:48
516
原创 # LeetCode 509. 斐波那契数 | 递归与动态规划详解
动态规划 | \( O(n) \) | \( O(n) \) | 通用场景 || 递归 | \( O(2^n) \) | \( O(n) \) | 教学示例,不推荐实际使用 || 动态规划优化 | \( O(n) \) | \( O(1) \) | 对空间要求严格的场景 |- **递归公式**:\( F(n) = F(n-1) + F(n-2) \)。**任务**:给定整数 \( n \),计算 \( F(n) \)。
2025-03-10 21:45:42
909
原创 **《爬楼梯问题终极解析:从递归爆栈到动态规划的优化之路》**
每次你可以爬 `1` 或 `2` 个台阶。爬到第 `n` 阶的最后一步可能是从 `n-1` 阶爬1步,或从 `n-2` 阶爬2步。因此总方法数为 `f(n) = f(n-1) + f(n-2)`。- **重复计算**:计算 `f(5)` 时会重复计算 `f(3)` 和 `f(4)`,时间复杂度为 `O(2^n)`。时间复杂度优化至 `O(n)`,空间复杂度 `O(n)`。- **栈溢出风险**:当 `n=45` 时,递归深度过大,导致栈溢出。- `n=3` → 输出 `3`(1+1+1、1+2、2+1)
2025-03-09 23:01:07
1975
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅