动态规划
文章平均质量分 91
包含了动态规划经典题目
HoryC
这个作者很懒,什么都没留下…
展开
-
动态规划系列之「编辑距离」
72. 编辑距离给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = "horse", word2 = "ros"输出:3解释:horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')示例 2:输入:word1原创 2020-10-24 23:13:43 · 315 阅读 · 0 评论 -
动态规划系列之「最大子序和」
53. 最大子序和给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。这道题不能用滑动窗口来做,因为数组中含有复数,这样就无法决定窗口的大小。和为S的连续正数序列 中便用到了滑动窗口思路可看官方题解,讲的很清楚,这里不再赘述…也可参考 labuladong方法一:动态规划class Solution { public int maxSubArray(int[] nums) { int tmp = 0; // tmp原创 2020-10-20 20:56:58 · 313 阅读 · 0 评论 -
动态规划系列之「最长公共子序列」
1143. 最长公共子序列给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。最长公共子序列(Longest Common Su原创 2020-10-19 00:21:32 · 295 阅读 · 0 评论 -
动态规划系列之「零钱兑换II」
给定不同面额的硬币coins和一个总金额amount。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。这道题是在0-1背包问题的变形,是完全背包问题,那么什么是完全背包问题呢?再来回顾一下0-1背包的题目:给你一个可装载重量为W的背包和N个物品(每个物品不一样),每个物品有重量和价值两个属性。其中第i个物品的重量为wt[i],价值为val[i],现在让你用这个背包装物品,最多能装的价值是多少?0-1背包问题中物品的数量是有限的,准确来说每个物品都是独一无二的,而这里的每一种.原创 2020-10-17 13:53:36 · 556 阅读 · 0 评论 -
动态规划系列之「0-1背包问题」
给你一个可装载重量为W的背包和N个物品(每个物品不一样),每个物品有重量和价值两个属性。其中第i个物品的重量为wt[i],价值为val[i],现在让你用这个背包装物品,最多能装的价值是多少?示例:输入:W = 4, N = 3wt = [2, 1, 3]val = [4, 2, 3]输出:6解释:选择前两件物品装进背包,总重量 3 小于W,可以获得最大价值 6。这个题目中的物品不可以分割,要么装进包里,要么不装,不能说切成两块装一半。这也许就是 0-1 背包这个名词的来历。动态规划.原创 2020-10-16 14:23:35 · 311 阅读 · 0 评论 -
动态规划系列之「最长回文子序列」
516. 最长回文子序列给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。注意:子序列是不要求连续的示例 1:输入"bbbab"输出 4一个可能的最长回文子序列为 "bbbb"。示例 2:输入"cbbd"输出 2一个可能的最长回文子序列为 "bb"。这里对 dp 数组的定义是:在子串 s[i..j] 中,最长回文子序列的长度为 dp[i][j]。具体来说,如果我们想求 dp[i][j],假设知道子问题 dp[i+1][原创 2020-10-15 13:38:33 · 2440 阅读 · 2 评论 -
动态规划系列之「最长连续递增序列」
674. 最长连续递增序列给定一个未经排序的整数数组,找到最长且连续的递增序列,并返回该序列的长度。示例 1:输入: [1,3,5,4,7]输出: 3解释: 最长连续递增序列是 [1,3,5], 长度为3。尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为5和7在原数组里被4隔开。 示例 2:输入: [2,2,2,2,2]输出: 1解释: 最长连续递增序列是 [2], 长度为1。**注意:**数组长度不会超过10000。思路:连续递增,那么只考虑nums[i]原创 2020-10-14 15:49:01 · 253 阅读 · 0 评论 -
动态规划系列之「最长递增子序列的个数」
673. 最长递增子序列的个数给定一个未排序的整数数组,找到最长递增子序列的个数。示例 1:输入: [1,3,5,4,7]输出: 2解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。示例 2:输入: [2,2,2,2,2]输出: 5解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。「最长递增子序列」那道题谁让求最长子序列的长度,这道题是求个原创 2020-10-13 16:27:34 · 612 阅读 · 1 评论 -
动态规划系列之「最长递增子序列」
给定一个无序的整数数组,找到其中最长上升子序列的长度。注意: 这里没要求子序列连续。示例:输入:[10, 9, 2, 5, 3, 7, 101, 18]输出:4解释:最长的上升子序列是[2, 3, 7, 101],长度为4说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。算法的时间复杂度应该为O(n^2)进阶:你能将算法的时间复杂度降到O(nlgn)吗?方法一: 动态规划思路:首先要定义 dp 数组的含义:dp[i] 表示以 nums[i] 这个数结.原创 2020-10-12 16:23:27 · 704 阅读 · 0 评论 -
动态规划系列之「leetcode322.零钱兑换」
322. 零钱兑换给定不同面额的硬币coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。零钱兑换问题符合最优子结构,比如你想求 amount = 11 时的最少硬币数(原问题),如果你知道凑出 amount = 10 的最少硬币数(子问题),你只需要把子问题的答案加一(再选一枚面值为 1 的硬币)就是原问题的答案。因为硬币的数量是没有限制的,所以子问题之间没有相互制,是互相独立的。如何列出正确的状态转移方程原创 2020-10-11 17:33:17 · 141 阅读 · 0 评论