LeetCode动态规划
肉丸不肉
这个作者很懒,什么都没留下…
展开
-
动态规划的题目汇总
一、斐波那契数列爬楼梯打家劫舍问题/强盗抢劫二、矩阵路径矩阵的最小路径和矩阵的总路径数三、数组区间数组区间和数组中等差数列的划分四、分割整数分割整数的最大乘积按平方数来分割整数解码方法/分割整数构成字母字符串五、子序列最长递增子序列最长对数链最长公共子序列六、背包问题分割等和子集01字符构成的最多字符串找零钱的最少硬币数找零...原创 2020-04-11 00:45:06 · 410 阅读 · 0 评论 -
LeetCode 72. Edit Distance(编辑距离)
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = "horse", word2 = "ros"输出:3解释:horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除...原创 2020-04-10 01:38:46 · 260 阅读 · 0 评论 -
LeetCode 583. Delete Operation for Two Strings(两个字符串的删除操作)
给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。示例:输入: "sea", "eat"输出: 2解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea"public int minDistance(String word1, String word2) { in...原创 2020-04-10 01:37:50 · 224 阅读 · 0 评论 -
LeetCode 188. Best Time to Buy and Sell Stock IV(只能进行 k 次的股票交易)
最多可以完成 k 笔交易public int maxProfit(int k, int[] prices) { //三维DP动态规划。三个维度,第一维表示天,第二维表示交易了几次,第三维表示是否持有股票 if(prices == null) return 0; int len = prices.length; if(len ==...原创 2020-04-10 00:39:48 · 221 阅读 · 0 评论 -
LeetCode 123. Best Time to Buy and Sell Stock III(只能进行两次的股票交易)
最多可以完成 两笔 交易输入: [3,3,5,0,0,3,1,4]输出: 6解释: 在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。 随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3public int ...原创 2020-04-10 00:30:20 · 223 阅读 · 0 评论 -
LeetCode 714. Best Time to Buy and Sell Stock with Transaction Fee(买卖股票的最佳时机含手续费)
你可以无限次地完成交易,但是你每次交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。(每次交易:买入+卖出,一个回合)输入: prices = [1, 3, 2, 8, 4, 9], fee = 2输出: 8解释: 能够达到的最大利润: 在此处买入 prices[0] = 1在此处卖出 prices[3] = 8在此处买入 prices[4] ...原创 2020-04-10 00:17:23 · 186 阅读 · 0 评论 -
LeetCode 309. Best Time to Buy and Sell Stock with Cooldown(最佳买卖股票时机含冷冻期)
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。输入: [1,2,3,0,2]输出: 3 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]public int maxProfit(int[] prices) { if(prices == null) return 0; int len = prices.length;...原创 2020-04-10 00:07:37 · 205 阅读 · 0 评论 -
LeetCode 377. Combination Sum IV(组合总和 Ⅳ)
示例:nums = [1, 2, 3]target = 4所有可能的组合为:(1, 1, 1, 1)(1, 1, 2)(1, 2, 1)(1, 3)(2, 1, 1)(2, 2)(3, 1)请注意,顺序不同的序列被视作不同的组合。因此输出为 7。有顺序的完全背包public int combinationSum4(int[] nums, int targe...原创 2020-04-09 21:51:00 · 218 阅读 · 0 评论 -
LeetCode 139. Word Break(单词拆分)
示例 1:输入: s = "leetcode", wordDict = ["leet", "code"]输出: true解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。示例 2:输入: s = "applepenapple", wordDict = ["apple", "pen"]输出: true解释: 返回 true 因为 "applep...原创 2020-04-09 21:44:04 · 253 阅读 · 0 评论 -
LeetCode 518. Coin Change 2(零钱兑换 II)
示例 1:输入: amount = 5, coins = [1, 2, 5]输出: 4解释: 有四种方式可以凑成总金额:5=55=2+2+15=2+1+1+15=1+1+1+1+1示例 2:输入: amount = 3, coins = [2]输出: 0解释: 只用面额2的硬币不能凑成总金额3。假设每一种面额的硬币有无限个。——完全背包问题public int c...原创 2020-04-09 21:33:45 · 201 阅读 · 0 评论 -
LeetCode 322. Coin Change(零钱兑换)
Example 1:Input: coins = [1, 2, 5], amount = 11Output: 3 Explanation: 11 = 5 + 5 + 1Example 2:Input: coins = [2], amount = 3Output: -1每种硬币的数量是无限的——完全背包问题public int coinChange(int[] coins,...原创 2020-04-09 21:15:57 · 209 阅读 · 0 评论 -
LeetCode 474. Ones and Zeroes(一和零)
示例 1:输入: Array = {"10", "0001", "111001", "1", "0"}, m = 5, n = 3输出: 4解释: 总共 4 个字符串可以通过 5 个 0 和 3 个 1 拼出,即 "10","0001","1","0" 。示例 2:输入: Array = {"10", "0", "1"}, m = 1, n = 1输出: 2解释: 你可以拼出...原创 2020-04-09 17:45:39 · 220 阅读 · 0 评论 -
LeetCode 416. Partition Equal Subset Sum(分割等和子集)
对于这个问题,我们可以先对集合求和,得出 sum,把问题转化为背包问题:给一个可装载重量为 sum / 2 的背包和 N 个物品,每个物品的重量为 nums[i]。现在让你装物品,是否存在一种装法,能够恰好将背包装满?Input: [1, 5, 11, 5]Output: trueExplanation: The array can be partitioned as [1, 5,...原创 2020-04-09 17:32:02 · 259 阅读 · 0 评论 -
LeetCode 1143. Longest Common Subsequence(最长公共子序列)
输入:text1 = "abcde", text2 = "ace" 输出:3 解释:最长公共子序列是 "ace",它的长度为 3。public int longestCommonSubsequence(String text1, String text2) { int n1 = text1.length(), n2 = text2.length(); in...原创 2020-04-09 17:14:46 · 204 阅读 · 0 评论 -
LeetCode 646. Maximum Length of Pair Chain(最长数对链)
Input: [[1,2], [2,3], [3,4]]Output: 2Explanation: The longest chain is [1,2] -> [3,4]法一:动态规划和LeetCode第300题(最长子序列)思路一样。 public int findLongestChain(int[][] pairs) { //按照区间end进行升序排列...原创 2020-04-09 17:01:05 · 185 阅读 · 0 评论 -
LeetCode 300. Longest Increasing Subsequence(最长上升子序列)
输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。public int lengthOfLIS(int[] nums) { int n = nums.length; int[] dp = new int[n];//dp[i]表示以nums[i]结尾的最长上升子序列(包含nums[...原创 2020-04-09 16:45:38 · 156 阅读 · 1 评论 -
动态规划-背包九讲(结合代码)
一、01背包有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。每种物品仅有一件,可以选择放或不放。二、完全背包有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最...原创 2020-03-27 22:20:39 · 475 阅读 · 0 评论 -
动态规划入门-完全背包与多重背包问题
物品不止有一个的情况,物品不止有一个也分两种。一种是不作任何限制,要多少有多少,这种称为完全背包问题;另一种是依然有个数限制,这种称为多重背包问题。一、完全背包在背包问题当中,背包的容量是状态,而选择哪个物品进行获取则是决策,当我们制定了一个决策之后,背包会从一个状态转移到另一个状态。而动态规划算法就是枚举所有状态和决策,获得所有的状态转移,并且记录这个过程中每个状态能够获得的最优解。...原创 2020-03-27 09:54:54 · 302 阅读 · 0 评论 -
动态规划入门-01背包问题
一、背包问题描述当下有一个容量是V的背包,和n个体积分别是v[i],价值是w[i]的物品。请问,我们最多能够获得多少价值的物品?由于每种物品只有一个,也就是物品只有拿和不拿两种状态,所以这个问题被称为01背包问题。二、贪心和反例这种问题我们最先想到的就是贪心法,比如优先拿价值大的物品,或者是性价比高的物品,但是我们很容易构思出反例。举个例子,比如背包的容量是10,我们有3个物品,...原创 2020-03-27 09:40:46 · 271 阅读 · 0 评论 -
LeetCode 91. Decode Ways(解码方法)
一条包含字母 A-Z 的消息通过以下方式进行了编码:'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:输入: "12"输出: 2解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。示例 2:输入: "226"输出: 3解释: 它可以解码为 "BZ" (2 26), "...原创 2020-03-18 20:10:36 · 264 阅读 · 0 评论 -
LeetCode 279. Perfect Squares(完全平方数)
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例 1:输入: n = 12输出: 3 解释: 12 = 4 + 4 + 4.示例 2:输入: n = 13输出: 2解释: 13 = 4 + 9. public int numSquares(int n) { /...原创 2020-03-18 17:12:56 · 231 阅读 · 0 评论 -
LeetCode 343. Integer Break(整数拆分)
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。说明: 你可以假设 n 不小于 2 且不大于 58。 public int in...原创 2020-03-18 17:03:10 · 222 阅读 · 0 评论 -
LeetCode 413. Arithmetic Slices(等差数列划分)
一个等差数列至少包含三个元素A = [0, 1, 2, 3, 4]return: 6, for 3 arithmetic slices in A:[0, 1, 2],[1, 2, 3],[0, 1, 2, 3],[0, 1, 2, 3, 4],[ 1, 2, 3, 4],[2, 3, 4]dp[i] 表示以 A[i] 为结尾的等差递增子区间的个数。当 A[i] - ...原创 2020-03-18 16:47:30 · 205 阅读 · 0 评论 -
LeetCode 303. Range Sum Query - Immutable(区域和检索-数组不可变)
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。示例:给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()sumRange(0, 2) -> 1sumRange(2, 5) -> -1sumRange(0, 5) -> -3说明:你可以假设数组不...原创 2020-03-18 16:35:30 · 215 阅读 · 0 评论 -
LeetCode 62. Unique Paths(不同路径)
题目描述:统计从矩阵左上角到右下角的路径总数,每次只能向右或者向下移动。dp思路:到达右下角的路径数 = 到达右下角上面一格的路径数 + 到达右下角左边一格的路径数令 dp[i][j] 是到达 i, j 最多路径dp[i][j] = dp[i-1][j] + dp[i][j-1]对于第一行 dp[0][j],或者第一列 dp[i][0],由于都是在边界,所以只能为 1。只能沿着边边走...原创 2020-03-18 16:20:57 · 235 阅读 · 0 评论 -
LeetCode 64. Minimum Path Sum(最小路径和)
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[ [1,3,1], [1,5,1], [4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。dp[i][j] 的值代表直到走到 (i,j)(i,j) 的最小路径和 public ...原创 2020-03-18 16:07:18 · 206 阅读 · 0 评论 -
LeetCode 70. Climbing Stairs(爬楼梯)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶法一、递归dp(空间复杂度为O(N)) public int climbStairs(int n) { ...原创 2020-03-18 15:40:45 · 218 阅读 · 0 评论 -
动态规划学习总结
一、动态规划引入动归问题的一般形式:求最值eg:求最长递增子序列、最小编辑距离求解动归的核心:穷举因为要求最值,肯定要把所以可行的答案穷举出来,然后在其中找最值动归三要素:重复子问题、最优子结构、状态转移方程二、求解动归问题的一般流程暴力递归会有大量重复计算对于递归来说,要画递归树:分析复杂度、寻找递归低效的原因带备忘录的递归备忘录:数组/...原创 2020-03-18 14:50:14 · 312 阅读 · 0 评论