![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP
文章平均质量分 53
bsbcarter
这个作者很懒,什么都没留下…
展开
-
LeetCode-Unique Paths II
是1的follow up,只是grid中会出现obstacle 用1表示[ [0,0,0], [0,1,0], [0,0,0]]注意:可以在原gird中修改数值,要判断是1还是0,因为每个格子只扫一遍,所以修改也不影响。但是对于第一个格子要单独判断,如果像上面那个题一样,首先在最外面将[0][0]设置为1,在循环里面不加入位置判断(是否在扫第一个格子),就会把它当原创 2015-02-11 11:30:48 · 333 阅读 · 0 评论 -
**LeetCode-Distinct Subsequences
dp!感觉地推公式好难想 用了一个m*n矩阵 下面是讲解 递推看了讲解感觉能看懂 但是在0位置多出一行一列 并且初始化的数并不能很直观的想出来/** * Solution (DP): * We keep a m*n matrix and scanning through string S, while * m = T.length() + 1 and n = S.length() + 1原创 2015-10-07 06:55:05 · 219 阅读 · 0 评论 -
*LeetCode-Edit Distance
常规做法是用一个mn matrix 然后update条件是假如这一位相等 那么就等于左上角 假如不等就是左,上, 左上三个的min加一初始化要多处一行一列 初始化成和index相同然后优化算法是只用一行的array加上一个数字来记录public class Solution { public int minDistance(String word1, String word2)原创 2015-10-07 08:32:29 · 270 阅读 · 0 评论 -
*LeetCode-Scramble String
以为只要包含的各种字母个数相同就好了 但是有一些情况还是不满足的不但数字要满足 而且还要满足partition之后可以recursive的满足 见判断条件还可以用dp 下次研究public class Solution { public boolean isScramble(String s1, String s2) { if ( s1.equals(s2) )原创 2015-10-08 03:02:31 · 255 阅读 · 0 评论 -
**LeetCode-Regular Expression Matching
太麻烦了!!!recursive的方法是围绕 p第二位是不是*来分的首先要判断p是否为空 然后return slen == 0注意不能反过来 假如s是空 然而p不是空 也是有可能的!假如是*那么分几种可能的情况 其中要注意的是当 s的第一位和p的第二位相匹配了 不要就把第一位以及*扔掉 仍然留着和后面匹配 因为aa 和 a*的情况 第二个a还需要*public class原创 2015-10-23 09:02:51 · 302 阅读 · 0 评论 -
**LeetCode-Best Time to Buy and Sell Stock III
递推公式太难想了 并且为了省空间 这个答案只用了两个k大的数组 k代表交易次数所以内层循环为何要从后往前进行就思考了很久 是为了不把上次外层循环算出的 j - 1覆盖掉 j 那一次还要用,所以不能从头上开始具体local 和global的更新方式 看讲解 http://blog.csdn.net/linhuanmars/article/details/23236995publi原创 2015-10-08 09:07:24 · 293 阅读 · 0 评论 -
*LeetCode-Maximal Rectangle
DP!!!!!!分别用和宽度相等的三个数组 记录每一行这个位置所处的字符所在的rect的左右边界和高度left(i,j) = max(left(i-1,j), curleft), curleft can be determined from the current rowright(i,j) = min(right(i-1,j), curright), curright can b原创 2015-10-23 02:56:17 · 225 阅读 · 0 评论 -
*LeetCode-Minimum Path Sum
dp 每一个格等于 min( 左边,上边)+ 本格 只要判断好边界条件就行public class Solution { public int minPathSum(int[][] grid) { int row = grid.length; int col = grid[0].length; for ( int i = 0; i <原创 2015-09-20 21:44:58 · 261 阅读 · 0 评论 -
*LeetCode-Perfect Squares
本来以为可以像combination sum一样用backtracking, 结果超时了用dp 要想清楚每个位置的数字是如何得来的 这个位置时 min( dp[ i + j * j ], dp [ i ] + 1 ) 第一个代表就是原来的值,第二个代表用 i + j * j来组成n注意java array initialize 用fill其次要注意两层循环的边界public cla原创 2015-09-22 01:55:50 · 359 阅读 · 0 评论 -
*LeetCode-Longest Valid Parentheses
用一个stack记录每个char的位置 假如有可以凑成一对的就pop 没有就在里面留着 这样扫过一遍之后 留下的都是没有凑对的 然后找到所有没有凑对的之间的距离 就是之间连续的valid()的长度 注意最后一个stack里面的char和string最后的位置 以及stack里面第一个char和0位置之间的两个substring也要计入public class Solution { pu原创 2015-10-11 05:35:57 · 270 阅读 · 0 评论 -
*LeetCode-Interleaving String
2d 动归 boolean matrix 每一位看左边或者上面 上面的话t [ i - 1 ] [ j ] == true && s2.charAt ( j ) == s3.charAt( i + j )就说明 t[ i ] [ j ] = true 同理左边假如符合也可以但是要注意初始化 要多出来一行一列代表一边假如是空string的情况 然后这样的实际代码里面 index实际就不是从0开始原创 2015-10-11 07:00:54 · 335 阅读 · 0 评论 -
*LeetCode-House Robber II
house robber 1是dp 要记得怎么做!第二个变成了circle 需要考虑首尾相接可以选一个房子让他不被rob 然后就break成一个直线 就能用1的方法算出一个max然后让他旁边的房子不被rob 算出另一个max 两个比较就好了 public class Solution { public int rob(int[] nums) { if ( n原创 2015-10-27 05:23:23 · 292 阅读 · 0 评论 -
*LeetCode-Ugly Number II
记录三个指针 指向上一次被乘以 2 3 5 的地方分别 Assume you have Uk, the kth ugly number. Then Uk+1 must be Min(L1 * 2, L2 * 3, L3 * 5).public class Solution { public int nthUglyNumber(int n) { if原创 2015-09-25 06:04:39 · 236 阅读 · 0 评论 -
*LeetCode-Paint House
backstracking和dp的时间复杂度! 这个题backstracking超时了 dp就省时间一些每个格子是这个房子某种颜色 + min(截至上个房子另一种颜色,上一个房子第三种颜色)public class Solution { public int minCost(int[][] costs) { if ( costs == null || costs原创 2015-10-21 06:07:36 · 364 阅读 · 0 评论 -
*LeetCode-Longest Increasing Subsequence
dp基本的dp o(n方)每次扫这个数字所有前面的有几个小于他的 然后更新这个位置为止的longest 这个数字完成之后 就更新global maxpublic class Solution { public int lengthOfLIS(int[] nums) { if ( nums == null || nums.length == 0 )原创 2015-11-05 04:24:39 · 232 阅读 · 0 评论 -
*LeetCode-Maximum Subarray
动态规划 找sum最大的subarray的sum不光要维护一个全局的max还要维护一个使用了当前这个element的local 最大,local是比较(A[i], A[i] + local)就是说A[i]一定包含在当前的local最优解中,要判断是否还要保留之前的那些element。public class Solution { public int maxSubArray(int原创 2015-03-08 10:28:13 · 313 阅读 · 0 评论 -
*LeetCode-Triangle
DP问题第一遍做的时候是top-down 当前这层的数值从上一层得到,非常麻烦的地方在于需要判断这个元素是否在一层两端。bottom-up方法就比较直观,不需要考虑边界,因为对于地n-1行arr [ i ] = min(arr[ i ],arr [ i + 1] )+ 当前bottom-up:public class Solution { public int minimu原创 2015-03-08 12:26:55 · 294 阅读 · 0 评论 -
LeetCode-Climbing Stairs
答案和fibnacci数列一样,最简单的dp首先不要用一个array存,只存当前两个数就可以其次注意边界条件 npublic class Solution { public int climbStairs(int n) { int first = 1; int second = 1; for ( int i = 2; i <= n原创 2015-03-08 10:00:09 · 253 阅读 · 0 评论 -
*LeetCode-Best Time to Buy and Sell Stock
扫数组到当前这一天的时候,局部最优就是要么今天卖出(昨天不卖了)(前提是之前已经买了,且已知最大profit是在昨天卖出),要么今天买入(局部profit为零)所以local的比较参数不是很好想明白。public class Solution { public int maxProfit(int[] prices) { if (prices == null|| pr原创 2015-03-08 11:28:40 · 307 阅读 · 0 评论 -
*LeetCode-Unique Binary Search Trees
卡特兰数的应用之一,还有一个是让求有多少种方式配对括号。http://en.wikipedia.org/wiki/Catalan_number这个题发现对于每个数字n 解法数=左子树0个结点的方法 * 右子树n-1个节点的方法 + 左1个节点*右子n-2个.......要注意的是要多存一个arr[0] = 1 数组是n+1大小的public class Solution {原创 2015-03-08 11:50:40 · 271 阅读 · 0 评论 -
*LeetCode-Maximum Product Subarray
因为是乘积,所以可能是一个很小的负数,再乘以一个负数,就会得到很大的乘积。所以除了localMax globalMax 还要记录一个localminlocalmin和localmax每次都是要三个数比较,localMax * A[ i ], localMin * A[ i ], A[ i ], 同时假如先更新min 则要保存一下 否则max再更新的时候 用的就不是上个数得到的min了 而是更新原创 2015-03-09 00:12:35 · 314 阅读 · 0 评论 -
LeetCode-Longest Substring Without Repeating Characters
This question belong to the same category as those such as "longest substring without repeating characters", "minimum window substring", and "substring with concatenation of all words". To solve thi原创 2015-03-10 01:29:10 · 302 阅读 · 0 评论 -
*LeetCode-Unique Binary Search Trees II
比第一个题要求高 不但要给出个数 是要给出所有可能的树每次确定一个root 然后 (1,root -1)就是左子树 (root+1,n)就是右子树注意边界条件 start > end的时候要返回一个list 里面是一个null node 而不能是一个null list 因为这种情况是这个树没有左子或者右子 然后就指向nullpublic class Solution { pu原创 2015-09-25 04:47:57 · 143 阅读 · 0 评论 -
*LeetCode-Word Break
递推式子不太好想 每个substring 都可以check leetcode l + eetcode , le + etcode, lee + tcode, ......所以记录一个boolean数组 和string长度一样 每一位代表 从开头到这一位为止 是否存在字典里(并不需要一整个substring是属于一个词)public class Solution {原创 2015-09-25 06:31:09 · 252 阅读 · 0 评论 -
*LeetCode-Maximal Square
天啊 想不出来没有想明白矩阵中应该存什么,存的是到这个格为止最大square的边长规律是 假如这个位置是0 那么到这个格的最大边长就是0假如是1 那么就是它周围三个格的最小值+1同时需要记录一个全局最大边长 每次updatepublic class Solution { public int maximalSquare(char[][] matrix) {原创 2015-09-25 08:59:51 · 259 阅读 · 0 评论 -
**LeetCode-Paint Fence
不知道怎么做 思路是 每次考虑当前这个和前一根是否相同 假如想要相同 那就不可以用上一次是不同的那个次数 假如不同 就和上上根没有关系 只要跟上一根不同就行 就有k-1种 并且要乘以上一次(dif + same)最后return 也要把diff same相加public class Solution { public int numWays(int n, int k) {原创 2015-10-17 08:11:36 · 899 阅读 · 0 评论 -
**LeetCode-House Robber
DP 题 想不清楚怎么做 需要再刷几道,这个的prevno prevyes分别是如何得来的 需要搞清楚public class Solution { public int rob(int[] nums) { int prevNo = 0; int prevYes = 0; for ( int i = 0; i < nums.lengt原创 2015-09-16 05:32:40 · 274 阅读 · 0 评论 -
LeetCode-Unique Paths
二维动态规划每个格子等于左边的格子加上面的格子,所以需要按列扫描整个grid,并且注意边界。原创 2015-02-11 11:02:04 · 327 阅读 · 0 评论