P53 最大子数组和
本文介绍使用动态规划解决“最大子数组和”问题。定义状态 `dp[i]` 表示以第 `i` 个元素结尾的最大子数组和。状态转移方程为:`dp[i] = max(nums[i], dp[i-1] + nums[i])`,即当前元素单独成段或加入前一个子数组。初始化 `dp[0] = nums[0]`,遍历数组完成状态更新后,再找出所有 `dp[i]` 中的最大值作为结果。该方法时间复杂度为 O(n),空间复杂度为 O(n),是线性动态规划的经典入门题。
本文介绍使用动态规划解决“最大子数组和”问题。定义状态 `dp[i]` 表示以第 `i` 个元素结尾的最大子数组和。状态转移方程为:`dp[i] = max(nums[i], dp[i-1] + nums[i])`,即当前元素单独成段或加入前一个子数组。初始化 `dp[0] = nums[0]`,遍历数组完成状态更新后,再找出所有 `dp[i]` 中的最大值作为结果。该方法时间复杂度为 O(n),空间复杂度为 O(n),是线性动态规划的经典入门题。
本文介绍了解决N皇后问题的深度优先搜索(DFS)算法。核心难点在于判断皇后放置时的斜对角线冲突,通过三个布尔数组分别记录列、主对角线和副对角线的占用情况。利用树形结构进行搜索,并在不满足条件时及时剪枝,显著提升效率。代码实现中,递归遍历每一行,在每行尝试放置皇后并更新状态,回溯时恢复现场。当成功放置n个皇后时,将结果加入答案。该方法有效解决了N皇后问题的所有合法布局,具有清晰的逻辑与较高的执行效率。
该题要求生成给定数组的全排列,但数组中可能包含重复元素,因此需要避免产生重复的排列。解决方案是先对数组进行排序,使相同元素相邻,然后在深度优先搜索(DFS)过程中进行剪枝:当当前元素与前一个元素相同,且前一个元素尚未被使用时,跳过当前元素,以确保相同元素的相对顺序固定,从而避免重复排列。使用一个标记数组 `st` 记录每个元素是否已被选入当前路径。通过回溯法枚举所有不重复的排列,最终返回所有唯一排列结果。算法时间复杂度为 O(n! / ∏(k_i!)),其中 k_i 是各重复元素的重复次数。
本文介绍了一道关于全排列的算法题,使用深度优先搜索(DFS)解决。给定一个无重复数字的数组,要求返回所有可能的排列组合。作者通过递归实现DFS,利用标记数组`st`记录每个元素是否已被选入当前路径,避免重复选择。每次递归到达叶子节点时,将当前排列加入结果集。代码结构清晰,核心在于状态的回溯:每层递归尝试未使用的元素,递归返回后恢复状态。作者提到在LeetCode上不推荐使用全局变量,因此所有状态均通过参数传递,与竞赛编程习惯略有不同,初时稍感不适应。该解法时间复杂度为O(n!),适用于输入规模较小的情况。
本文讲解力扣第44题“通配符匹配”,是一道典型的线性动态规划问题。给定字符串 `s` 和模式串 `p`,其中 `p` 包含普通字符、`?`(匹配任意单个字符)和 `*`(匹配任意字符串,包括空串),判断两者是否完全匹配。解法使用二维DP数组 `f[i][j]` 表示 `s` 的前 `i` 个字符与 `p` 的前 `j` 个字符是否匹配。初始化时考虑 `*` 可匹配空串,状态转移分三种情况:当 `p[j-1]` 为 `*` 时,可继承 `f[i][j-1]` 或 `f[i-1][j]`;否则若字符相等或为 `?`,则依赖 `f[i-1][j-1]`。最终结果为 `f[n][m]`。代码清晰地实现了该逻辑,时间复杂度为 O(nm)。
本文讲解LeetCode“字符串相乘”问题的解法。作者指出该题属于高精度乘法,不能直接转换为整型计算以避免溢出。解法模拟竖式乘法过程:用两个嵌套循环处理每一位的相乘,并将结果累加到对应位置。随后统一处理进位,最后将结果数组转为字符串并去除前导零。代码使用C++实现,通过倒序遍历原字符串完成逐位运算,最终返回正确结果。关键细节包括进位处理和前导零的删除,确保输出格式正确。题目虽思路直观,但边界处理需谨慎。