
动态规划
Jiale685
幸福并不是男子汉所该追求的
展开
-
【LeetCode】123. Best Time to Buy and Sell Stock III 解题报告(Python)
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [3,3,5,0,0,3,1,4]输出: 6解释: 在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候原创 2020-07-06 00:49:32 · 569 阅读 · 0 评论 -
【LeetCode】122. Best Time to Buy and Sell Stock II 解题报告(Python)
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6原创 2020-07-05 23:23:20 · 438 阅读 · 0 评论 -
【LeetCode】121. Best Time to Buy and Sell Stock 解题报告(Python)
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。示例 2:输入: [7原创 2020-07-05 22:45:24 · 375 阅读 · 0 评论 -
【LeetCode】120. Triangle 解题报告(Python)
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。例如,给定三角形:[[2],[3,4],[6,5,7],[4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。解题思路:这个题求从上到下的最小路径和,看起来可以用动态规划解决,(动态规划通常可以求解最优解,有几种结果等问题)这一题情况比较多,我们要分开考虑,并且从原创 2020-07-05 22:28:57 · 468 阅读 · 0 评论 -
【LeetCode】119. Pascal‘s Triangle II 解题报告(Python)
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例:输入: 3输出: [1,3,3,1]解题思路1:这个题与【LeetCode】118. Pascal‘s Triangle 解题报告(Python)一致,可以稍稍优化一下118的算法,每次保存上一行,根据上一行计算当前行即可提交代码1:(动态规划,Runtime: 36 ms, faster than 89.08 % )class Solution: def ge原创 2020-07-05 19:35:51 · 247 阅读 · 0 评论 -
【LeetCode】118. Pascal‘s Triangle 解题报告(Python)
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。解题思路:可以看出来每一行除了开始和结尾的1,其他位置元素都与上一行有关,那这就让我想到了动态规划这一行的值=上一行的上一列+上一行的这一列元素,即dp[i][j] = dp[i-1][j-1] + dp[i-1][j]提交代码:(动态规划,Runtime: 40 ms, faster than 65.14 % )class Solution: def generat原创 2020-07-05 18:59:18 · 292 阅读 · 0 评论 -
【LeetCode】115. Distinct Subsequences 解题报告(Python)
这个题是要求不同子序列有几种组法,给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数。一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)示例 1:输入:S = “rabbbit”, T = “rabbit”输出:3解释:如下图所示, 有 3 种可以从 S 中得到 “rabbit” 的方案。(上箭头符号 ^ 表示选取的字母)rabbbit^原创 2020-07-05 09:30:05 · 267 阅读 · 0 评论 -
【LeetCode】97. Interleaving String 解题报告(Python)
题目分析:给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。示例 1:输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”输出: true示例 2:输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”输出: false解题思路:当你遇到字符串且让你求...原创 2019-04-20 21:51:16 · 577 阅读 · 0 评论 -
【LeetCode】95. Unique Binary Search Trees II 解题报告(Python)
题目分析:给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。示例:输入: 3输出:[[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1,3],[1,null,2,null,3]]解释:以上的输出对应以下 5 种不同结构的二叉搜索树:解题思路:这一题可以用递归或递归+动态规划解,我们先说递归帮助理解,这一...原创 2019-04-19 22:22:37 · 471 阅读 · 0 评论 -
【LeetCode】96. Unique Binary Search Trees 解题报告(Python)
题目分析:给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?示例:输入: 3,输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树:解题思路:对于一点i,当其为根节点时,左子树的节点的个数为i-1,(为1,…i-1),右子树的个数为n-i(为,i+1,…n)。对一个根来说,唯一二叉树的个数为左子树结点的个数乘以右子树的个数。而根节点可以从1到n 中选择...原创 2019-04-18 16:56:08 · 520 阅读 · 0 评论 -
【LeetCode】91. Decode Ways 解题报告(Python)
题目分析:一条包含字母 A-Z 的消息通过以下方式进行了编码:‘A’ -> 1,B’ -> 2, … ,‘Z’ -> 26。给定一个只包含数字的非空字符串,请计算解码方法的总数。如:输入: “12”输出: 2解释: 它可以解码为 “AB”(1 2)或者 “L”(12)。解题思路:把这个题可以分解为几种小问题进行解决,一般涉及字符串求几种情况,或者最优情况便可用动态规划...原创 2019-04-16 13:15:58 · 454 阅读 · 0 评论 -
【LeetCode】72. Edit Distance 解题报告(Python)
题目分析:这一题是编辑距离,给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符、删除一个字符、替换一个字符。例如:输入: word1 = “horse”, word2 = “ros”输出: 3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse ->...原创 2019-04-02 16:44:48 · 675 阅读 · 0 评论 -
【LeetCode】70. Climbing Stairs 解题报告(Python)
题目分析:这一题是爬楼梯问题,每次可以走一步或者两步,让你求有多少种不同的方法可以爬到楼顶。例如:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1 阶 + 1 阶 + 1 阶1 阶 + 2 阶2 阶 + 1 阶解题思路:你可以多算几项(1,2,3,5,8)就会发现他就是斐波那契数列,思路就是第n项可以先走一步或者两步,那就是说第n项就等于第n-1与n-2项之和,可以用动...原创 2019-04-01 13:28:36 · 362 阅读 · 0 评论 -
【LeetCode】64. Minimum Path Sum 解题报告(Python)
题目分析:这一题与【LeetCode】62. Unique Paths,【LeetCode】63. Unique Paths II相似度很高,这次是每次走的路径长度给定了,求的是最短路径,可以建立二维dp数组解决,属于较简单的动态规划。其实题目也就是让求有向图的最短路径问题。解题思路:我们创建一个与原数组行列相同的dp数组,dp数组从左上更新到右下,过程如图:从左上出发,可以向右或者向下走,...原创 2019-03-27 19:30:32 · 340 阅读 · 0 评论 -
【LeetCode】63. Unique Paths II 解题报告(Python)
题目分析:这一题与【LeetCode】62. Unique Paths基本一致,只是多了障碍物,遇到障碍物我们就令dp数组在该位置为0,可以建立二维dp数组解决,遇到障碍物我们就令dp数组在该位置为0,它每一个点的路径数与左边和上面的点路径数相关。解题思路:我们创建一个与原数组行列相同的dp数组,dp数组从左上更新到右下,过程如图:从左上出发,可以向右或者向下走,故每个点的路径数等于上面的值...原创 2019-03-26 17:14:22 · 292 阅读 · 0 评论 -
【LeetCode】62. Unique Paths 解题报告(Python)
题目分析:这一题是以及经典的动态规划入门题,可以建立二维数组解决,它每一个点的路径数与左边和上面的点路径数相关。解题思路:看下面这个图从左上出发,向右有一条路径,向下有一条路径,到右下可以先向右走再过去或者先向下走再过去,2 = 1 + 1这个图也是一样的思路,每个点等于上面的数字加左面的数字最后一个图,也是题目中给的图测试代码(非提交代码):class Solution: ...原创 2019-03-26 16:21:39 · 504 阅读 · 0 评论 -
【LeetCode】53. Maximum Subarray 解题报告(Python)
题目分析:这一题是让我们找相加最大的子串,这个是属于动态规划的一类题目,在循环的时候我们每次循环都找出以当前位置结束的最大值,再用一个max_sum记录最大的并返回。代码说明:next_sum = max(next_sum + nums[i], nums[i])是比较当前数值大,还是加上之前的最大字串数值大,即找出以当前位置结束的最大值。测试代码class Solution: d...原创 2019-03-20 19:59:24 · 581 阅读 · 0 评论 -
【LeetCode】44. Wildcard Matching 解题报告(Python)
题目分析:这个题又是做类似正则匹配的,和【LeetCode】10. Regular Expression Matching基本一致。我们采用动态规划解决,创建状态数组dp然后分别判断是*怎么处理,或者是?怎么处理,详见测试代码。测试代码:class Solution: def isMatch(self, s, p): m, n = len(s), len(p) ...原创 2019-03-17 09:21:34 · 1779 阅读 · 0 评论 -
【LeetCode】10. Regular Expression Matching解题报告(Python)
题目分析:这道题目是实现简单的正则表达式,需要实现'.'与'*',其中'.'可表示任何字符,'*'表示前一个字符出现0或任意次。首先想到贪心穷举的方法去解决但是考虑到类似'.*'这种可以变成任意串的东西很难穷举。考虑其他方法,其中递归便是一种,将问题分为子问题去考虑。一般情况下递归可转换为动态规划,动态规划可以用空间换取时间,由于递归时间长可能会时间超限我们也应该考虑使用动态规划解决。递归...原创 2019-02-25 22:13:17 · 2046 阅读 · 0 评论