动态规划
Czy_whlg
不忘本心!
展开
-
Maximum Length of Repeated Subarray
718.Maximum Length of Repeated SubarrayGiven two integer arraysAandB, return the maximum length of an subarray that appears in both arrays.Example 1:Input:A: [1,2,3,2,1]B: [3,2,1,4,7]Out...原创 2020-04-16 09:11:20 · 177 阅读 · 0 评论 -
Minimum ASCII Delete Sum for Two Strings
712.Minimum ASCII Delete Sum for Two StringsGiven two stringss1, s2, find the lowest ASCII sum of deleted characters to make two strings equal.Example 1:Input: s1 = "sea", s2 = "eat"Output: ...原创 2020-04-11 15:32:08 · 130 阅读 · 0 评论 -
Number of Longest Increasing Subsequence
673.Number of Longest Increasing SubsequenceGiven an unsorted array of integers, find the number of longest increasing subsequence.Example 1:Input: [1,3,5,4,7]Output: 2Explanation: The two l...原创 2020-03-30 23:36:50 · 299 阅读 · 0 评论 -
2 Keys Keyboard
1.解析题目大意,利用复制和粘贴,求解最少经过几步可以完成N个'A'2.分析我刚开始理解错题意啦,我以为只要是不少于n个'A'字符就可以。例如n= 7,如果不要求个数的话,经过6步就可以,第1步复制,第2步粘贴,第3步粘贴,此时为AAA,第4步复制,第5步粘贴,第6步粘贴,此时为AAAAAAAAA。原来只需要复制n个A,参考@Grandyang博主的思路,我还是习惯用DP,因...原创 2020-03-10 18:48:24 · 195 阅读 · 0 评论 -
动态规划总结
算法题型当中应该说最难的就是动态规划啊,贪心算法很大程度上取决于贪心策略,所以动态规划整体上比贪心应用更广泛,且贪心未必能找到最优解,但动态规划一定可以找到最优解。一般运用动态规划的地方有以下特征:①求最值②不要求序列连续从硬币和相等子序列问题中,发现一个trick:如果要求数组中的个数不限:从小到大遍历(可以保证一个数可以取多次);若个数有限定:从大到小遍历(数只能取一次);...原创 2020-02-24 22:19:37 · 181 阅读 · 0 评论 -
Delete Operation for Two Strings
1.解析题目大意,求解最少经过多少次删除,使字符串s1和s2相等。2.分析如果单纯根据题意进行求解,还是比较难的,我就陷在里面啦。参考@Grandyang博主的思路,才恍然发现这是最长公共子序列,只不过进行了简单的包装,话说我记忆也没有最长公共子序列,尴尬~。可以将题意转换一下,求解两个字符串的最长公共子序列,然后用这两个字符串的总长度减去最长公共子序列的长度的两倍,不就是经过删除...原创 2020-02-23 11:42:39 · 156 阅读 · 0 评论 -
Ones and Zeroes
1.解析题目大意,给定0和1的个数,求解最多可以组成数组中元素的个数。2. 分析这道题的解法不是很容易想到,参考@Grandyang的解法。因为存在0和1两个改变的状态,所以我们利用二维数组res[i, j]表示由i个0和j个1所能构成的最多数组元素。zeros表示当前数组元素0的个数,ones表示当前数组元素1的个数,如果当前m >= zeros && n...原创 2020-01-12 11:01:19 · 268 阅读 · 0 评论 -
Coin Change
1. 解析题目大意,找零钱,给具有一定数额的硬币,求解能找零的最少数量的硬币。2. 分析这道题本质上是Partition Equal Subset Sum的升级版。将题目转换一下,就是,给定n个数,求能否可以用这n个数组成所给定的目标数?如果可以,返回使用的最少个数。很明显的一道动态规划题,用dp[i]表示当目标 target = i 时,需要找零所用的最少硬币数量。那么我们就可以...原创 2019-12-21 10:30:37 · 282 阅读 · 0 评论 -
Partition Equal Subset Sum
1. 解析题目大意,将序列分成和相等的两个子序列。2. 分析我想到的解法是,首先排除特殊的情况,因为题目要求划分成两个和相等的子序列,如果当前序列的总和为奇数或者序列当中存在某个元素大于和的一半,那么肯定无法划分成两个子序列;对于其他情况采用深度优先检索,看是否存在满足的情况,如果存在,直接返回true;反之,返回false即可。思想比较简单,但这种解法是无法OJ的,主要是因为递...原创 2019-12-17 17:24:32 · 280 阅读 · 0 评论 -
Increasing Triplet Subsequence
1. 解析题目大意,求解子序列是否存在一个长度为3的递增子序列。2. 分析涉及子序列问题,一般都是动态规划。与Longest Increasing Subsequence最大的不同在于,只要求长度为3即可,思路是一样的。subsequence[i]表示[0, i]内递增子序列的最大长度,每次向后检索,然后更新当前的最大长度即可,前面依赖的状态之前已经求解过,不过题目要求O(1)的...原创 2019-12-06 21:16:01 · 246 阅读 · 0 评论 -
Largest Divisible Subset
1. 解析题目大意,求解最长的子序列,要求改子序列中的元素两两之间能整除。一道DP题2. 分析只要涉及DP的题目都不简单,我最初想到的是用DFS去求解,结果无法OJ。参考了@Grandyang的解法,其实本题的难点就在于子序列动态增长的过程中怎么记录当前最长子序列的起始索引,本思路采用一个比较巧妙的结构,利用pair键值对存储,dp[i]表示序列nums[0, i]范围内最长的子...原创 2019-12-05 17:34:17 · 233 阅读 · 0 评论 -
Range Sum Query 2D - Immutable
1. 解析题目大意,求解区域内数字的和。2. 分析比较容易想到的解法是,将区域内的数字逐个相加,我采用Spiral Matrix中的方法,固定住左上角和右下角的坐标,就可以遍历外围的区域,然后继续缩小区域范围。但这种方法的时间复杂度为O(n^2),而且会重复计算,无法OJ。class NumMatrix {public: NumMatrix(vector<...原创 2019-12-03 20:08:08 · 118 阅读 · 0 评论 -
Wiggle Subsequence
1. 解析题目大意,求最长的摆动子序列长度,可以认为Wiggle Sort II的进阶版2. 分析一般求解这种子序列的题目,都是DP的题。摆动序列的状态一共分为两种,第一种:正, 负, 正, 负, .......;第二种:负, 正, 负, 正, ......;所以整体上和Longest Increasing Subsequence不同点在于,当前状态不仅仅只有一种,所以我们要借...原创 2019-12-03 19:35:39 · 166 阅读 · 0 评论 -
Super Ugly Number
1. 解析这道题Ugly Number II的升级版,题目大意,求解第n个super Ugly Number,super Ugly Number(除1之外)的因子只存在因子列表primes中,换汤不换药,只是将3个因子改成了n个因子2. 分析最直接的做法就是利用优先队列,每次取出最小的数,然后依次和因子列表primes中的每个因子依次相乘,以产生下一个super Ugly Num...原创 2019-11-25 17:29:49 · 142 阅读 · 0 评论 -
Longest Increasing Subsequence
1. 解析题目大意,求解最长的递增子序列。类似的还有递增连续子序列,一般求解子序列都会涉及到动态规划,本题也不例外2. 分析难点在往后搜索的过程中,如何实时记录每个状态的起始位置和对应的长度,动态规划的一个最重要的特征就是在搜索下一个状态的时候,之前所有相关的状态信息都已经记录好,即待搜索状态依赖上一个状态。用dp[i]表示字符串[0, i]的最长递增子序列长度,为了将之前的所有状...原创 2019-11-23 12:52:11 · 182 阅读 · 0 评论 -
Ugly Number II
1. 解析题目大意,求解第n个ugly数(仅仅包含因子2,3,5的正整数,除1之外).2.分析刚开始看到这道题,我的第一反应是优先队列,蓝桥杯也出现过这道题。优先队列最重要的一个性质:队首是整个队列的最值,这道题让我们取第n个数,所以得把队首设置为整个队列中的最小值,为了防止加载重复的元素,利用hashtable存储已经出现过的元素即可解决,每次取队首,然后依次和2,3,5因子相乘...原创 2019-11-20 20:20:48 · 129 阅读 · 0 评论 -
Maximal Square
1. 解析题目大意,从矩阵当中选择面积最大的正方形区域2. 分析刚开始看的时候,我也以为跟Surrounded Regions这道题一样,当本题不同在于正方形是个固定的区域,并不是任意发散的,所以本质上这两道题的思路还是不一样的。先解析一种暴力破解的方式,也比较容易理解,用counter数组记录每个列'1'出现的个数,如果是连续出现,即可以认为是长度。例如 [ [1 0 1 0...原创 2019-11-13 17:35:35 · 157 阅读 · 0 评论 -
Decode Ways
1. 解析动态转移方程为:dp[i] = dp[i-1] + dp[i-2] i >= 2class Solution {public: int numDecodings(string s) { //动态规划 if (s.empty() || s[0] == '0'){ return 0; ...原创 2019-11-12 08:58:56 · 81 阅读 · 0 评论 -
House Robber II
1. 解析题目大意,从首尾相邻的房子里面获取最多的钱,要求不能偷相邻的两间房子。刚开始看到题目,我以为是DFS,然而写了半天,突然发现DFS并不好设计,哎~2. 分析如果仔细分析,我们还是可以发现,如果选择了第一间房子,那么最后一间房子不能选择;反之,如果选择最后一件房子,第一间房子就不能选择,因为它们相邻的。所以,我们可以分为两种情况考虑:从[1, n-1]间房子选择或者从[2...原创 2019-11-11 17:34:12 · 155 阅读 · 0 评论 -
Maximum Product Subarray
解析:每次看到动态规划就有点懵,哎~,明明知道是动态规划,就是想不到怎么建立动态转移方程。以为例: 2 3 -2 41 分析比较容易想到的是,依次查找[2] [2 3] [2 3 -2] [2 3 -2 4] [3] [3 -2] [3 -2 4] [-2] [-2 4] [4],时间复杂为O(n^2),很明显这不是出题的本意,难点就在于0和负数的出现,当遇到0时,当前子序列的乘积就会变为0...原创 2019-11-01 17:35:38 · 167 阅读 · 0 评论 -
Word Break
解析 :题意:单词划分,将字符串分解成多个单词,每个单词都要出现在字典当中,如果存在,返回true,否则返回false分析:本题并没有要求我们将每一种满足划分条件的列出来,只需要找到一种情况即可。要保证划分后的每一个单词都要出现在字典当中,即意味着后面划分的单词一定是基于****前面划分的单词基础之上,即下一个状态依赖于上一个状态,可以利用动态规划进行求解,同时也可以采用带记忆状态的DFS进...原创 2019-10-30 18:28:33 · 169 阅读 · 0 评论 -
Longest Palindromic Substring
解析:这道题是动态规划,当前状态依赖上一个状态,有点类似于KMP算法dp[j][i] 表示子串 s(j)-s(i) 是否是回文,i表示当前字串为s(0)-s(i),j表示搜索的起始位置,当s[j] != s[i],s(j)-s(i) 不是回文;当s[j] = s[i] 时,只存在3种不同的状态:j=i,表示当前字串长度为1,自然就是回文j和i相邻,即 j + 1 = i,即当前子串长度...原创 2019-10-17 19:51:45 · 141 阅读 · 0 评论