动态规划(dp)
文章平均质量分 54
ggaoda
这个作者很懒,什么都没留下…
展开
-
leetcode-338.比特位计数
给你一个整数n,对于0原创 2022-07-31 11:12:30 · 136 阅读 · 0 评论 -
leetcode-312.戳气球
有n个气球,编号为0到n-1,每个气球上都标有一个数字,这些数字存在数组nums中。现在要求你戳破所有的气球。戳破第i个气球,你可以获得枚硬币。这里的i-1和i+1代表和i相邻的两个气球的序号。如果i-1或i+1超出了数组的边界,那么就当它是一个数字为1的气球。求所能获得硬币的最大数量。...原创 2022-07-19 20:14:40 · 251 阅读 · 0 评论 -
leetcode-241.为运算表达式设计优先级
给你一个由数字和运算符组成的字符串expression,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。你可以按任意顺序返回答案。生成的测试用例满足其对应输出值符合32位整数范围,不同结果的数量不超过104。......原创 2022-07-15 19:03:06 · 229 阅读 · 0 评论 -
leetcode-买卖股票的最佳时机含手续费
给定一个整数数组 ,其中 表示第 天的股票价格 ;整数 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。示例2:思路:股票类问题的一类(含手续费),我们同样得可以画出状态机转换图:表示第天手里没股票的状态表示第天手里有股票的状态初始化好第0天的状态即可遍历每天的股票更新dp,详细代原创 2022-07-14 12:23:58 · 120 阅读 · 0 评论 -
leetcode-494.目标和
给你一个整数数组 和一个整数 。向数组中的每个整数前添加 或,然后串联起所有整数,可以构造一个 表达式 :例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。示例2:思路:设我们加上的元素和为 , 加上的元素和的绝对值为那么我们需要的目标值设数组总和为,那么又有由以上两式得出 (转化为背包问题的背包大小)则本题转化为,我原创 2022-07-14 10:54:25 · 84 阅读 · 0 评论 -
leetcode-646. 最长数对链
给出 个数对。 在每一个数对中,第一个数字总是比第二个数字小。现在,我们定义一种跟随关系,当且仅当 时,数对才可以跟在 后面。我们用这种形式来构造一个数对链。给定一个数对集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。思路:这道题和leetcode-300.最长子序列是一样的,首先明确dp是指什么,表示以这个数对结尾的最长链长度,和300题一样,我们也需要定义一个来同步更新我们需要的最最长链详细思路可以参看300题的解答:leetcod原创 2022-07-13 12:13:43 · 100 阅读 · 0 评论 -
leetcode-583. 两个字符串的删除操作
给定两个单词 和 ,返回使得 和 相同所需的最小步数。每步 可以删除任意一个字符串中的一个字符。示例2:思路:最长公共子序列的变种题,求出两者的最长子序列后再额外计算一下即可最长公共子序列问题解答见这篇:leetcode-1143.最长公共子序列这里不再详细解释涉及知识点:1.动态规划(dp)...原创 2022-07-11 20:34:59 · 182 阅读 · 0 评论 -
leetcode-343. 整数拆分
给定一个正整数 ,将其拆分为 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。示例2:思路:1.首先,我们分析这道题dp的切入点,表示可以拆分情况中的最大乘积2.那我们怎么得到这个乘积呢,假设这个数是n,我们可以从开始遍历,将其拆分为 …3.而对于这之中,还存在一个子因子拆分问题,比如这里的8还可以拆成4+4,那么乘积会更大所以,我们可以综合分析为:这里的最内层就是2.里面的初步拆分,里的就是3.里面的子因子拆分最后我们可以得出代码:原创 2022-07-11 20:08:01 · 418 阅读 · 0 评论 -
leetcode-53. 最大子数组和
给你一个整数数组 ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。示例2:示例3:思路:很简单的一道动态规划题我们需要找到动态规划的一个切入点比如本题是 以每一个数作为末尾就是以第i-1个数为末尾的最大子数组和求的时候我们是利用来实现比较的在求每个最大子数组的过程中,我们同时更新maxSum变量的值,这样遍历更新完dp后,maxSum即为所求结果具体实现:涉及知识点:1.动态规划(dp)...原创 2022-07-11 19:20:23 · 120 阅读 · 0 评论 -
leetcode-213.打家劫舍 II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统, 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。示例2:示例3:思路:和leetcode-198.打家劫舍那道题唯一不同是第一家和最后一家变为相邻状态了此时我们额外讨论一下第一家和最后一家偷哪家就行了偷首不偷尾,偷尾不偷首198题的解题方法见:leet原创 2022-07-11 17:16:44 · 104 阅读 · 0 评论 -
leetcode-309. 最佳买卖股票时机含冷冻期
给定一个整数数组,其中第 表示第天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例2:思路:对于含有冷冻期的股票问题,我们可以添加两个状态-----持股状态和未持股状态相应的我们可以画出状态图:我们对于每天的股票,更新它的这里需要注意的是更新的时候,与其他三个不同因为对于buy的这一原创 2022-07-11 16:46:06 · 241 阅读 · 0 评论 -
leetcode-188. 买卖股票的最佳时机 IV
给定一个整数数组 ,它的第 个元素 是一支给定的股票在第 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例2:思路:1.若 我们买入卖出需要至少两天时间,所以如果是这种情况,我们直接利用贪心即可,一有利润就卖出,这样所求得的总利润最大2.若 在这种情况下,情况相对复杂,我们可以利用两个dp数组 ,用来记录在第次买入的最大利润,用来记录在第次卖出的最大利润本题我迷糊的点是:for循环里,原创 2022-07-10 11:42:04 · 116 阅读 · 0 评论 -
leetcode-121.买卖股票的最佳时机
给定一个数组 ,它的第 个元素 表示一支给定股票第 天的价格。你只能选择 买入这只股票,并选择在 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 。示例2:思路:我们可以对数组遍历一遍实现,利用变量记录利润,buy记录成本依次遍历,每次更新最小成本和最大利润即可涉及知识点:1.动态规划(dp)...原创 2022-07-09 15:49:47 · 66 阅读 · 0 评论 -
leetcode-10.正则表达式匹配
给你一个字符串 和一个字符规律 ,请你来实现一个支持和的正则表达式匹配。示例2:示例3:思路:我这道题弄迷糊的一个点:的下标和的下标不是严格对应的对应的末尾字符是而不是弄清了这一点之后就可以分情况讨论了我们可以使用一个二维数组 ,其中 表示以 截止的字符串是否可以被以 截止的正则表达式匹配。根据正则表达式的不同情况,即字符、星号,点号,我们可以分情况讨论来更新 数组大概分的情况:1.特殊情况(和是否为)2.一般情况:(由正则p的末尾开始往前分析)末尾为.末尾...原创 2022-07-08 18:49:37 · 204 阅读 · 1 评论 -
leetcode-650.只有两个键的键盘
背包类问题题目详情最初记事本上只有一个字符 'A' 。你每次可以对这个记事本进行两种操作:Copy All(复制全部):复制这个记事本中的所有字符(不允许仅复制部分字符)。Paste(粘贴):粘贴 上一次 复制的字符。给你一个数字 n ,你需要使用最少的操作次数,在记事本上输出 恰好 n 个 'A' 。返回能够打印出 n 个 'A' 的最少操作次数。示例1:输入:3输出:3解释:最初, 只有一个字符 'A'。第 1 步, 使用 Copy All 操作。第 2 步, 使用 Pas原创 2022-05-03 15:18:57 · 279 阅读 · 0 评论 -
leetcode-72.编辑距离
背包类问题题目详情给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例1:输入:word1 = "horse", word2 = "ros"输出:3解释:horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')示例2:输入:word1原创 2022-05-03 11:09:02 · 175 阅读 · 0 评论 -
leetcode-322.零钱兑换
背包类问题题目详情给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。示例1:输入:coins = [1, 2, 5], amount = 11输出:3 解释:11 = 5 + 5 + 1示例2:输入:coins = [2], amount = 3输出:-1示例3:输入:coins = [1],原创 2022-05-03 10:36:27 · 240 阅读 · 0 评论 -
leetcode-474.一和零
背包类问题题目详情给你一个二进制字符串数组 strs 和两个整数 m 和 n 。请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个0和n个 1 。如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。示例1:输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3输出:4解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4 。原创 2022-05-03 10:11:06 · 135 阅读 · 0 评论 -
leetcode-416.分割等和子集
背包类问题题目详情给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。示例1:输入:nums = [1,5,11,5]输出:true解释:数组可以分割成 [1, 5, 5] 和 [11] 。示例2:输入:nums = [1,2,3,5]输出:false解释:数组不能分割成两个元素和相等的子集。我的代码:本题可以转化为在数组中挑选元素总和价值为sum/2的数字所以可以视为0-1背包问题/*本题的可以转化原创 2022-05-02 09:11:42 · 171 阅读 · 0 评论 -
动态规划dp问题之背包问题(0-1 完全)
动态规划(dp)背包问题问题解释背包问题是一种组合优化的 NP 完全问题:有 N 个物品和容量为 W 的背包,每个物品都有自己的体积 w 和价值 v,求拿哪些物品可以使得背包所装下物品的总价值最大。如果限定每种物品只能选择 0 个或 1 个,则问题称为 0-1 背包问题;如果不限定每种物品的数量,则问题称为无界背包问题或完全背包问题。解决办法:用动态规划来解决背包问题。以 0-1 背包问题为例。我们可以定义一个二维数组 dp存储最大价值,其中 dp[i][j] 表示前 i 件物品体积不超过原创 2022-04-29 16:52:12 · 347 阅读 · 0 评论 -
leetcode-1143.最长公共子序列
给定两个字符串 和 ,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如, 是 的子序列,但 不是 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。示例2:示例3:思路:建立一个二维数组 ,其中 表示到第一个字符串位置 为止、到第二个字符串位置为止、最长的公共子序列长度。涉及知原创 2022-04-23 16:35:35 · 131 阅读 · 0 评论 -
leetcode-300.最长递增子序列
动态规划(dp)题目详情给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例1:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。示例2:输入:nums = [0,1,0,3,2,3]输出:4示例3:输入:nums原创 2022-04-23 16:01:02 · 126 阅读 · 0 评论 -
leetcode-139.单词拆分
动态规划(dp)题目详情给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。示例1:输入: s = "leetcode", wordDict = ["leet", "code"]输出: true解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。示例2:输入: s = "applepenapple",原创 2022-04-22 17:02:46 · 380 阅读 · 0 评论 -
leetcode-91.解码方法
动态规划(dp)题目详情一条包含字母 A-Z 的消息通过以下映射进行了 编码 :‘A’ -> “1”‘B’ -> “2”…‘Z’ -> “26”要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106" 可以映射为:"AAJF" ,将消息分组为 (1 1 10 6)"KJF" ,将消息分组为 (11 10 6)注意,消息不能分组为 (1 11 06) ,因为 "06" 不能映射为 "F" ,这是由于 "6" 和 "原创 2022-04-22 16:20:01 · 128 阅读 · 0 评论 -
leetcode-279.完全平方数
动态规划(dp)题目详情给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。示例1:输入:n = 12输出:3 解释:12 = 4 + 4 + 4示例2:输入:n = 13输出:2解释:13 = 4 + 9思路:本题属于dp里的分割类问题,分割类问题不依赖于元素之间相邻的位置,而是满足一定条件来分割…用dp[i原创 2022-04-22 15:20:57 · 757 阅读 · 0 评论 -
leetcode-221.最大正方形
动态规划(dp)题目详情在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。示例1:输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]输出:4示例2:输入:matrix = [["0","1"],["1","0"]]输出:1思路:对于在矩阵内搜索正方形或长方形的题型,一种常见的做法原创 2022-04-21 10:53:08 · 522 阅读 · 0 评论 -
leetcode-542. 01矩阵
动态规划(dp)题目详情给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。两个相邻元素间的距离为 1 。示例1:输入:mat = [[0,0,0],[0,1,0],[0,0,0]]输出:[[0,0,0],[0,1,0],[0,0,0]]示例2:输入:mat = [[0,0,0],[0,1,0],[1,1,1]]输出:[[0,0,0],[0,1,0],[1,2,1]]思路:这道题也可以利用b原创 2022-04-20 17:44:19 · 616 阅读 · 0 评论 -
leetcode-64.最小路径和
动态规划(dp)题目详情给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例1:输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径 1→3→1→1→1 的总和最小。示例2:输入:grid = [[1,2,3],[4,5,6]]输出:12思路:每次只能向右或向下移动,根据dp我们可以知道,走到每一格的上一步不是上面就是左边,我们可原创 2022-04-20 16:57:45 · 108 阅读 · 0 评论 -
leetcode-413.等差数列划分
动态规划(dp)题目详情如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9]都是等差数列。给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。子数组 是数组中的一个连续序列。示例1:输入:nums = [1,2,3,4]输出:3解释:nums 中有三个子等差数组:[1, 2, 3]、[2, 3, 4] 和 [1,2,3,4] 自身。示例2:原创 2022-04-18 11:08:48 · 459 阅读 · 0 评论 -
leetcode-198.打家劫舍
动态规划(dp)题目详情你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4原创 2022-04-18 10:15:55 · 137 阅读 · 0 评论 -
leetcode-70.爬楼梯
动态规划(dp)题目详情假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例1:输入:n = 2输出:2解释:有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例2:输入:n = 3输出:3解释:有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶思路:斐波那契数列题。定义一个数组 dp,dp[i] 表示走到第 i 阶的方法数。原创 2022-04-16 17:17:57 · 565 阅读 · 0 评论