- 博客(25)
- 收藏
- 关注
原创 LeetCode.448 找到所有数组中消失的数字
原数组出现的位置设为负数,最后仍然为正数的位置即为没有出现过的数。进一步地,我们可以直接对原数组进行标记:把重复出现的数字在。
2023-03-23 16:03:03
122
原创 LeetCode.650 只有两个键的键盘
给你一个数字 n ,你需要使用最少的操作次数,在记事本上输出 恰好 n 个 'A'。返回能够打印出 n 个 'A' 的最少操作次数。Copy All(复制全部):复制这个记事本中的所有字符(不允许仅复制部分字符)。不同于以往通过加减实现的动态规划,这里需要乘除法来计算位置,因为粘贴操作是倍数增。最初记事本上只有一个字符 'A'。Paste(粘贴):粘贴 上一次 复制的字符。操作得到,其操作次数等价于把一个长度为。对于每个位置j,如果。我们使用一个一维数组。因此我们可以得到递推公式。
2023-03-14 17:03:38
124
原创 LeetCode.72 编辑距离(动态规划-字符串编辑)
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数。位置的消耗是 dp[i][j-1] + 1。当二者对应的字符不同时,修改的消耗是。错误代码:(没有处理好边界条件)为止,最多需要几步编辑。等于 dp[i-1][j-1],表示将第一个字符串到位置。,我们使用一个二维数组。位对应的字符相同时,
2023-03-14 10:10:42
110
原创 背包问题总结
背包问题是一种组合优化的 NP完全问题:有N个物品和容量为W的背包,每个物品都有自己的体积 w和价值v,求拿哪些物品可以使得背包所装下物品的总价值最大。如果限定每种物品只能选择 0个或1个,则问题称为0-1背包问题;如果不限定每种物品的数量,则问题称为无 界背包问题或完全背包问题。我们可以用动态规划来解决背包问题。以问题为例。我们可以定义一个二维数组dp 存储最大价值,其中 dp[i][j]表示前i件物品体积不超过j的情况下能达到的最大价值。在我们遍历到第 i。
2023-03-13 21:56:22
45
原创 LeetCode.322 零钱兑换 (完全背包问题)
一定大于所有可能的组合方 式,取最小值时一定不会是它。在动态规划完成后,若结果仍然是此值,则说明不存在满足条件 的组合方法,返回-1。计算并返回可以凑成总金额所需的 最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。因为每个硬币可以用无限多次,这道题本质上是完全背包。的原因是,在动态规划过程中有求 最小值的操作,如果初始化成-1。你可以认为每种硬币的数量是无限的。,而最多的组成方式是只用。
2023-03-13 21:40:37
53
原创 LeetCode.474 一和零 (背包问题)
请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1。如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集。给你一个二进制字符串数组 strs 和两个整数 m 和 n。接展示三维空间压缩到二维后的写法。背包问题,有两个背包大小,
2023-03-13 20:19:20
53
原创 LeetCode.416 分割等和字串 (背包问题)
这道题不需要考虑价值,因此我们只需要通过一个布尔值矩阵来表示状态转移 矩阵。注意边界条件的处理。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。同样的,我们也可以对本题进行空间压缩。注意对数字和的遍历需要逆向。,我们的目标是选取一部分物品,使得它们。背包问题,设所有数字和为。
2023-03-13 15:16:38
44
原创 LeetCode.1143 最长公共子序列 (动态规划子序列问题)
为止、最长的公共子序列长度。这样一来我们就可以很方便地分情况讨论这 两个位置对应的字母相同与不同的情况了。数组的最后一位结果即为题目所求,不需要再对每 个位置进行统计。对于子序列问题,第二种动态规划方法是,定义一个。给定两个字符串,求它们最长的公共子序列长度。在本题中,我们可以建立一个二维数组。的子序列的性质,并不必须以。表示到第一个字符串位置。
2023-03-13 09:44:05
60
原创 LeetCode.139 单词拆分 (动态规划 :分割问题)
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s。类似于完全平方数分割问题,这道题的分割条件由集合内的字符串决定,因此在考虑每个分。割位置时,需要遍历字符串集合,以确定当前位置是否可以成功分割。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。来源:力扣(LeetCode),需要初 始化值为真。
2023-03-08 15:43:22
134
原创 LeetCode.64 最小路径和(基本动态规划:二维)
给定一个 m × n 大小的非负整数矩阵,求从左上角开始到右下角结束的、经过的数字的和最小的路径。每次只能向右或者向下移动。
2023-03-07 21:57:12
123
原创 LeetCode.221最大正方形(二维动态规划 在矩阵中搜索正方形或长方形)
注意:min(dp[i-1][j-1],dp[i][j-1],dp[i-1][j]) 会报错。
2023-03-07 20:56:37
132
原创 LeetCode.542 01矩阵(双向二维动态规划)
一般来说,因为这道题涉及到四个方向上的最近搜索,所以很多人的第一反应可能会是广度优先搜索。但是对于一个大小 O(mn) 的二维数组,对每个位置进行四向搜索,最坏情况的时间复杂度(即全是 1) 会达到恐怖的 0(m2n2)。一种办法是使用一个 dp 数组做 memization,使得广度优先搜索不会重复遍历相同位置;另一种更简单的方法是,我们从左上到右下进行一次动态搜索,再从右下到左上进行一次动态搜索。两次动态搜索即可完成四个方向上的查找。
2023-03-07 16:34:02
125
原创 Leetcode.413 等差数列划分 (基本动态规划:一维)
这道题略微特殊,因为要求是等差数列,可以很自然的想到子数组必定满足 num[i]-num[i-1]= num[i-l]-num[i-2]。然而由于我们对于 dp 数组的定义通常为以i 结尾的,满足某些条件的子数组数量,而等差子数组可以在任意一个位置终结,因此此题在最后需要对 dp 数组求和。
2023-03-07 14:30:43
34
原创 Leetcode.413 等差数列划分 (基本动态规划:一维)
这道题略微特殊,因为要求是等差数列,可以很自然的想到子数组必定满足 num[i]-num[i-1]= num[i-1]-num[i-2]。然而由于我们对于 dp 数组的定义通常为以i 结尾的,满足某些条件的子数组数量,而等差子数组可以在任意一个位置终结,因此此题在最后需要对 dp 数组求和。
2023-03-07 14:25:09
40
原创 Leetcode.198 打家劫舍 (基本动态规划:一维)
定义一个数组 p,dp[i] 表示抢劫到第 i 个房子时,可以抢劫的最大数量。我们考虑 dp[i]此时可以抢劫的最大数量有两种可能,一种是我们选择不抢劫这个房子,此时累计的金额即为dp[i-1];另一种是我们选择抢劫这个房子,那么此前累计的最大金额只能是 dp[i-2],因为我们不能够抢劫第i -1 个房子,否则会触发警报机关。因此本题的状态转移方程为 dp[i] = max(dp[i-l],nums[i-1] + dp[i-2])。
2023-03-07 13:41:13
70
原创 Leetcode.70 爬楼梯 (基本动态规划:一维)
这里我们引用一下维基百科的播述:“动态规划(Dynamic Programming,DP)在。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间 ·....."动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解,对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。
2023-03-07 13:32:20
73
原创 (洛谷刷题)P1141 第K小整数
1.去重函数会去除相邻连续的重复元素,不相邻的不会去除。本题可以采用先排序,再去重,然后找第K小的元素。3.去重后数组的长度并未改变,如果有必要可以擦除。2.去重函数返回去重后的尾指针。
2022-11-22 15:45:00
159
原创 (洛谷刷题) UVA12100 打印队列Printer Queue
【代码】(洛谷刷题) UVA12100 打印队列Printer Queue。
2022-11-21 21:10:30
246
1
原创 (洛谷刷题) UVA442 Matrix Chain Multiplication
本题的关键是解析表达式。本题的表达式比较简单,可以用一个栈来完成:遇到字母时将矩阵入栈,遇到用右括号时将栈顶的两个矩阵出栈并计算,然后将结果入栈。
2022-11-21 14:59:18
346
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人