DP
文章平均质量分 71
Dylan_Java_NYC
练很重要,总结更重要,感谢CSDN给了我这么好的平台交流。
展开
-
LeetCode Unique Binary Search Trees
原题链接在这里:https://leetcode.com/problems/unique-binary-search-trees/对于选取的点,它的返回值应该是它的不同左子树的个数*他的不同右子树的个数。边界调节,当n=0时,返回1,只返回一个空树,当n=1时,返回1,只有一个节点的树。AC Java:public class Solution { public int n原创 2015-09-11 02:21:45 · 414 阅读 · 0 评论 -
LeetCode Maximum Product Subarray
原题链接在这里:https://leetcode.com/problems/maximum-product-subarray/与Maximum Subarray类似。但出了要维护一个局部最大量外还需要同时多维护一个局部最小量。e.g.[-2,3,-4], 若不维护局部最小量,i = 1时,局部最大是3,全局最大也是3,i=2时 局部最大变成-4,全局最大变成3,但实际全局最大应该是8. 这原创 2015-09-15 12:14:55 · 467 阅读 · 0 评论 -
LeetCode Maximum Subarray
原题链接在这里:https://leetcode.com/problems/maximum-subarray/本题借鉴了这篇帖子:http://blog.csdn.net/linhuanmars/article/details/21314059采用的是DP解法,同时维护局部最优和全局最优,局部最优就是必须包含当前点的最优解,全局最优可以不包含当前点。历史信息就是local[i-1] 和原创 2015-09-15 11:48:57 · 595 阅读 · 0 评论 -
LeetCode Maximal Square
原题链接在这里:https://leetcode.com/problems/maximal-square/这是一道DP题,存储历史信息是到当前点能有的最大square, 用二维数组dp存储。更新方式是若当前点为0,则不更新,若当前点为1,则取上dp[i-1][j], 左dp[i][j-1], 左上dp[i-1][j-1]的中的最小值,开根号加一,最后平方为dp[i][j].初始第一行和原创 2015-09-15 22:41:29 · 473 阅读 · 0 评论 -
LeetCode Best Time to Buy and Sell Stock
原题链接在这里:https://leetcode.com/problems/best-time-to-buy-and-sell-stock/与Maximum Subarray相似,都是全局最优与局部最优问题。维护一个局部最优解,和一个全局最优解, 先更新局部最优解, 要么是原来的局部最优加上i天与i-1天得差价,要么是0(i天股价没有i-1天高), 然后维护全局最优,最后返回全局最优。原创 2015-09-15 23:05:17 · 620 阅读 · 0 评论 -
LeetCode Best Time to Buy and Sell Stock IV
原题链接在这里:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/本题是Best Time to Buy and Sell Stock III的general情况。但这里要注意若是k很大已经超过了prices.length的时候,若是按照DP的方法做会浪费时间以及空间。此时可以直接参照Best Time t原创 2015-09-16 12:42:17 · 923 阅读 · 0 评论 -
LeetCode Best Time to Buy and Sell Stock III
原题链接在这里:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/本题是Best Time to Buy and Sell Stock的进阶版。思路也很相似,仍旧是维护一个全局最优,一个局部最优。这里最多可以进行k次交易,让后本题把k变成2即可。全局最优global是到达第i天可以最多进行j次交易的利润是多少原创 2015-09-16 12:29:18 · 509 阅读 · 0 评论 -
LeetCode Maximal Rectangle
原题链接在这里:https://leetcode.com/problems/maximal-rectangle/与Largest Rectangle in Histogram Largest Rectangle in Histogram Largest Rectangle in Histogram Largest Rectangle in Histogram相似AC Java:pu原创 2015-09-17 22:55:18 · 466 阅读 · 0 评论 -
LeetCode Interleaving String
原题链接在这里:https://leetcode.com/problems/interleaving-string/这是一道DP题,用boolean数组dp维护历史数据,dp[i][j]表示长度为i的s1和长度为j的s2能否组成长度为 i+j 的s3.递推式是若当前s3的最后一个char与s1的最后一个char相同,并且dp[i-1][j]为true, 那么dp[i][j]为true;原创 2015-09-18 05:46:12 · 409 阅读 · 0 评论 -
LeetCode Longest Valid Parentheses
原题链接在这里:https://leetcode.com/problems/longest-valid-parentheses/和Largest Rectangle in Histogram都是往栈内存index. 生成一个stack, 从头往后扫string, 遇到'(', 就把当前index存入到stack中。当遇到 ')'时要看当前stack是后为空,若为空,更新新起点start原创 2015-09-17 23:24:06 · 393 阅读 · 0 评论 -
LeetCode Perfect Squares
原题链接在这里:https://leetcode.com/problems/perfect-squares/本题DP, 要存储的历史信息是到当前点 i, 需要几个perfect square组合,用一个长度为n+1的数组存储,先全部初始化为Integer.MAX_VALUE. 然后所有i*i的位置上初始化为1.每次更新比较复杂,是去res[i]+1和本来值的最小值。注意这里是i.e.g原创 2015-09-15 00:51:10 · 493 阅读 · 0 评论 -
LeetCode Decode Ways
原题链接在这里:https://leetcode.com/problems/decode-ways/DP题,保存的历史信息是到历史点有多少种decode的方法,用长度为len+1的数组保存,更新方式是若当前位i 和前一位 i-1两个组合的数字不合法则decode方法并没有增加,仍是dp[i-1]; 若合法,则应更改为dp[i-2]+dp[i-1]. 跟走楼梯相似。初始化为了方便把dp[0]原创 2015-09-15 07:37:57 · 415 阅读 · 0 评论 -
LeetCode Minimum Path Sum
原题链接在这里:https://leetcode.com/problems/minimum-path-sum/是DP题,与Unique Paths 和 Unique Paths II相似。存储历史信息是走到走到历史点的最小权重路径,更新当前点用上面点和左面点中的小值加上grid中当前点的值。跟Unique Paths 和 Unique Paths II 都有相同的第二种降维方原创 2015-09-15 06:55:57 · 460 阅读 · 0 评论 -
LeetCode Climbing Stairs
原题链接在这里:https://leetcode.com/problems/climbing-stairs/其实是Fibonacci Number, 举个例子,n = 100,假设登到99台阶有m种方法,登到98台阶有n种方法,那么从99到100都是上一步,所以还是m种方法, 从98台阶登到100都是一次登两个台阶,还是n种方法,若果在98登一个台阶,就是到了99,这种方法已经包含在最初登到9原创 2015-09-11 09:51:56 · 290 阅读 · 0 评论 -
LeetCode House Robber II
原题链接在这里:https://leetcode.com/problems/house-robber-ii/是House Robber的进阶题。这里第一家和最后一家不能同时偷,所以像House Robber建立一个res1, 把从第一家到倒数第二家能偷最大值依次存入res1, 再建立一个res2, 把第二家到最后一家能偷最大值依次存入res2. 返回res1最后一个值 和res2最后一个值原创 2015-09-11 11:30:36 · 490 阅读 · 0 评论 -
LeetCode Triangle
原题链接在这里:https://leetcode.com/problems/triangle/从底往上动态规划,维护一个res数组,res里的每一个元素都是从底走到这一点的最小值,更新方式是取res在下一行与自己临近的两个元素的最小值加上triangle在这点本身的元素。最后返回res[0]即可。Note: 若triangle 只包含一行也考虑到了,因为若只有一行,res会先初始化成最原创 2015-09-12 03:08:07 · 346 阅读 · 0 评论 -
LeetCode House Robber
原题链接在这里:https://leetcode.com/problems/house-robber/若没有房子,return 0; 若只有一个房子,return nums[0], 也就是这个房子里的钱; 若有两个房子,返回两个房子里钱较多的那个钱。若是大于两个,因为不能偷邻家,所以新建一个array, 就是res,里面对应的 i 位存能偷到的最多钱的数目, 从前往后每一步都是最优的,就是原创 2015-09-11 10:18:50 · 444 阅读 · 0 评论 -
LeetCode Word Break II
原题链接在这里:https://leetcode.com/problems/word-break-ii/本题是Word Break的进阶题,要返回所有wordbreak的结果。本题参照了这篇帖子:http://www.cnblogs.com/springfor/p/3877056.html首先更具isWordBreak判断是否能拆,若能拆看从头到尾走,找到了一个wordDict里包含的原创 2015-09-13 01:40:09 · 494 阅读 · 0 评论 -
LeetCode Word Break
原题链接在这里:https://leetcode.com/problems/word-break/这是一道DP题,解题思路参考了这篇帖子:http://blog.csdn.net/linhuanmars/article/details/22358863这道题仍然是动态规划的题目,我们总结一下动态规划题目的基本思路。首先我们要决定要存储什么历史信息以及用什么数据结构来存储信息。然后是原创 2015-09-12 06:49:56 · 460 阅读 · 0 评论 -
LeetCode Palindrome Partitioning II
原题链接在这里:https://leetcode.com/problems/palindrome-partitioning-ii/这道题与Word Break相似。用DP来做,需要保留的历史信息就是到当前点能分成几块Palindrome, 用一个int数组res保留。每次更新res[i+1], 比较i+1和res[j]+1大小,取小的。因为单个letter肯定是palindrome原创 2015-09-13 05:19:27 · 349 阅读 · 0 评论 -
LeetCode Unique Paths
原题链接在这里:https://leetcode.com/problems/unique-paths/若从DP角度考虑这个问题就是需保存历史数据为走到当前格子的不同路径数,用二维数组res保存。 更新当前点res[i][j]为上一行同列res[i-1][j]的值 + 本行上一列res[i][j-1]的值,因为走到上一行同列的值想走到当前格都是往下走一步,左边同理。初始条件是第一行和第一原创 2015-09-13 07:47:48 · 370 阅读 · 0 评论 -
LeetCode Unique Paths II
原题链接在这里:https://leetcode.com/problems/unique-paths-ii/是Unique Paths的进阶版题目。思路与Unique Paths相似,不同点在于加了障碍物,DP的更新当前点方式有所不同, 若是此处有障碍物,res里这一点就是0,若此处没有障碍物,res里这一点就同行上一列和同列上一行的和。Note: 初始化是点res[0][0].A原创 2015-09-14 01:39:54 · 397 阅读 · 0 评论 -
LeetCode Distinct Subsequences
原题链接在这里:https://leetcode.com/problems/distinct-subsequences/这是一道DP. 简历二维数组dp, dp[i,j]表示s[0....i]有多少种方法可以减成t[0.......j].更新方法是: 若s.charAt(i-1) == t.charAt(j-1), dp[i][j] = dp[i-1][j-1](用上最新的match, 之原创 2015-09-18 04:31:50 · 482 阅读 · 0 评论