随笔分类 - AL_DP
摘要:39. 组合总和 题意 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明: 所有数字(包括 target)都是正整数。解集不能包含重复的组
阅读全文
摘要:Range Sum Query 2D - Immutable 二维数组范围和 题意 在二维数组中求范围的和,需要注意的是: 解法 根据要求,可能会调用很多次的求和函数,设想如果范围比较大,那么简单的每次调用都要计算每行的和再累加显然是不符合题目的要求,因为题目说了矩阵是不可变的,因此我们可以使用动态
阅读全文
摘要:Word Break 单词分解 题意:这道题的思路和前面一道也是字符串的切分的题目的思路是一样的,这里是判断当前的字符串是否是字典中给定的字符串来组成。 回溯 回溯方法,可以用idx,也可以用当前子串的形式。 class Solution(object): def wordBreak(self, s
阅读全文
摘要:Longest Valid Parentheses 最长有效括号数 动态规划 思路:看到这道题,首先想到的是动态规划,然后想用之前做最长回文串的思路来做,但是后来发现它的括号并不一定是嵌套的,比如()(),这种情况下用之前的方法就不行了。 假定dp[i]表示从下标i开始到字符串最后构成的最长回文串的
阅读全文
摘要:Unique Binary Search Trees 唯一BST数量 思路:这道题如果不知道卡特兰数的话是做不出的,它的思想为结点个数为n的二叉树数量为左结点数量和右结点数量的乘积之和。 class Solution(object): def numTrees(self, n): """ :type
阅读全文
摘要:300. 最长上升子序列 题意 给定一个无序的整数数组,找到其中最长上升子序列的长度。 解题思路 动态规划:看到这种题目首先想到的就是dp,受到之前最长回文子串的影响,也以为是要用二维数组来解,然后用(i,j)记录区间的最长值,后来发现完全没有必要。假设dp[i]表示0到i中的最长序列长度,如果之前
阅读全文
摘要:10. 正则表达式匹配 题意 给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。 匹配应该覆盖整个字符串 (s) ,而不是部分字符串。 说明: s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和
阅读全文
摘要:516. Longest Palindromic Subsequence 题意:求字符串中回文串的最大长度。 动态规划 分析:假设dp[i][j]为字符串从i到j的回文串的最大长度,如果字符i等于j,则将之前的长度加上2;如果不相等,那么要么忽略i,要么忽略j,取两者的最大值,所以状态转移方程为:
阅读全文
摘要:392. Is Subsequence 这道题目可以使用很多种解法,包括是动态规划等等。 动态规划 s为匹配字符串,t为给定字符串假设dp[i][j]表示t从开始到第i个字符时对应s从开头到第j个字符,s所否是t的子序列。 分析:在比较的过程中,如果t[i]不等于s[j],则忽略掉当前的字符,取之前
阅读全文
摘要:523. Continuous Subarray Sum 题意:计算是否存在和为k的倍数连续子数组。 思路:不是很懂,大致上是说,如果第一次遇见不存在的模的结果时,则保存下来,但是如果遇到多个相同的求模的结果,说明它们之间的和必然是k的倍数。 class Solution(object): def
阅读全文
摘要:Climbing Stairs 题意:一共有n个台阶,每次只能走1或者2个台阶,求走到该台阶的路径个数。 动态规划 思路:当前走的路径个数取决于走一步和两步的个数,也就是之前走了一步的值(加下来走一步)和之前走了两步(接下来走两步)的值之和。 class Solution(object): def
阅读全文
摘要:House Robber II 题意:现在盗贼偷的房间围成了一个圆圈,但同样是不能偷相邻的两间房间,求偷的最大数目。 动态规划 分析:一开始,我想,既然是一个圆圈,那么就意味着在偷最后一位的时候,不仅仅要考虑到前一位有没有偷,还要考虑到第一位有没有偷,然后想通过判断,但是发现状态转移后无法去获知第一
阅读全文
摘要:198. House Robber 题意:盗贼可以到任意的房间偷东西,但是偷相邻的房间则会报警,求在不报警的情况下,偷到的最大数目的钱。 思路 这种求最大数目的题目,首先想到的就是动态规划,可以使用两个数组,分别纪录对当前房间进行偷和不偷操作后的最大数目。如果是偷当前房间,那么则不会去偷前一间房间,
阅读全文
摘要:121. Best Time to Buy and Sell Stock 题意:寻找合适的买入和卖出的时机,找出最大价值。注意的是,买入必须在卖出之前。 动态规划 用动态规划来找最小的价值,然后维护一个变量来找最大价值差。 状态转移方程为: class Solution(object): def m
阅读全文
摘要:115. Distinct Subsequences 动态规划 思路:假定dp[i][j] 表示字符串S[0,i]能够匹配字符串T[0,j]的个数。如果当前下标对应的值不相等,那么我们可以将当前的字符进行抛弃,取前一位的匹配的结果;相反,如果值是相等的,那么我们可以选择保留当前字符或者不保留,因为这
阅读全文
摘要:3. Longest Substring Without Repeating Characters 题意:计算字符串中最长不重复子串的长度。 思路:一开始的想法是利用dp来做,也确实可以做到,但是它的做法需要两层循环,外层遍历处理dp,内层遍历处理该位置的子字符串中的长度最大值,然后获取到子字符串后
阅读全文
摘要:647. Palindromic Substrings 题意:判断一个字符串中存在的最大回文个数。 这里需要考虑到各种子字符串,所以我用了两个循环,外层处理动态规划,内层处理到当前的子串。 class Solution(object): def countSubstrings(self, s): "
阅读全文
摘要:53. Maximum Subarray 题意:计算最大的连续子数组之和 动态规划 dp[i]表示为从当前下标i开始的最大子数组之和。 class Solution(object): def maxSubArray(self, nums): """ :type nums: List[int] :rt
阅读全文
摘要:128. Longest Consecutive Sequence 题意:给定一个未排序的数组,计算数组中的数字构成连续的最大个数。 动态规划 假定dp[i]表示从开始到当前位置的最长连续个数。 分析:如果遇见下一位比当前值要大1的值,则个数加一,如果是相等,则继续使用之前的值,如果都不符合,则重置
阅读全文
摘要:152. Maximum Product Subarray 前提:一开始没有想到DP,而是想到了用递归,为了要考虑到可能会出现多个负数,基本上是遍历每一种情况,很是复杂。 假定dp[i]表示从起始到该下标的乘积的最值。 思路:我们需要使用两个dp,一个纪录最小值,一个纪录最大值,相互利用更新得到最小
阅读全文