随笔分类 -  DP

摘要:class Solution: def maxCoins(self, nums: List[int]) -> int: # DP 因为dp[left][right] = argmax(dp[left][i]+dp[i][right]+left*i*right) # 这个遍历顺序就是,先中间,后两边 阅读全文
posted @ 2020-12-21 15:13 ChevisZhang 阅读(145) 评论(0) 推荐(0)
摘要:递归,DP两种方法 https://leetcode-cn.com/problems/interleaving-string/ class Solution: def isInterleave(self, s1: str, s2: str, s3: str) -> bool: # if sorted 阅读全文
posted @ 2020-12-16 14:13 ChevisZhang 阅读(97) 评论(0) 推荐(0)
摘要:class Solution: def longestPalindromeSubseq(self, s: str) -> int: # 本题的核心是怎么进行状态转移 # 对于 s[l] != s[r]的情况下,s[l:r]中的最大回文子序列来自于 max(s[l:r-1],s[l+1,r]) dp 阅读全文
posted @ 2020-12-15 13:06 ChevisZhang 阅读(87) 评论(0) 推荐(0)
摘要:class Solution: def isScramble(self, s1: str, s2: str) -> bool: # DP 难点分析: # 1.首先理解三层DP分别代表:长度,s1起点,s2起点 # 2.初始化DP长度为1的DP子串 # 3.状态转移方程,长度为l的dp[l]可以从dp 阅读全文
posted @ 2020-12-15 12:00 ChevisZhang 阅读(178) 评论(0) 推荐(0)
摘要:DP的思路: 1. 通常dp第一个难点都是找状态转移方程,对于 s中前i个字符与p中前j个字符: 1)p[j] == s[i] && dp[i-1][j-1] => dp[i][j] = True 2) p[j] == '?' && dp[i-1][j-1] => dp[i][j] = True 3 阅读全文
posted @ 2020-09-26 12:53 ChevisZhang 阅读(163) 评论(0) 推荐(0)
摘要:DP: 1. 这题的解题思路来源于暴力法,对于每一点,其积累的雨水等于 min(left_max,right_max) - height[i] 2. 而对于自身就是left_max或right_max时,显然相减等于0 2. 双指针 1. 使用本方法最重要的一点是想通,从左右两端找left_max, 阅读全文
posted @ 2020-09-15 09:34 ChevisZhang 阅读(168) 评论(0) 推荐(0)
摘要:解题思路: 1. 本题难点是把题目转化成DP,能理解状态转移方程 阅读全文
posted @ 2020-09-10 10:09 ChevisZhang 阅读(129) 评论(0) 推荐(0)
摘要:就是一个动态规划 阅读全文
posted @ 2020-09-08 12:35 ChevisZhang 阅读(91) 评论(0) 推荐(0)
摘要:回溯算法(超时 72/75): 1. 跳出条件: if position == n : self.res =True / if position > n : return 2. 递归条件: 遍历 position 所有可以跳跃的位置 3. 更新条件,这里不再是更新 resList,是更新res, 需 阅读全文
posted @ 2020-08-31 12:17 ChevisZhang 阅读(145) 评论(0) 推荐(0)
摘要:https://leetcode-cn.com/problems/house-robber/ 题目求数组非连续元素的最大和,状态转移方程为: dp[n] = max(dp[n-1],dp[n-2] + num) 所以本题只更新两个变量 , dp[n-2] , dp[n-1] 为Fst Sec 阅读全文
posted @ 2020-06-02 13:57 ChevisZhang 阅读(176) 评论(0) 推荐(0)
摘要:1. 常数空间DP: 53.152- 最大子序和/积 记录全局最优与当前最优 198/213 打家劫舍 记录 dp[i-2] dp[i-1] 2. O(n)空间DP: 300.最长上升子序列 279.完全平方数,具体参考第300题 求第n位,则把前n-1项的DP全求出来,最后通过状态转移方程求最后一 阅读全文
posted @ 2020-06-02 13:34 ChevisZhang 阅读(132) 评论(0) 推荐(0)
摘要:https://leetcode-cn.com/problems/maximum-subarray/ 用DP,不断更新全局最大值与当前最大值 阅读全文
posted @ 2020-06-02 11:51 ChevisZhang 阅读(89) 评论(0) 推荐(0)
摘要:给定一个无序的整数数组,找到其中最长上升子序列的长度。 总结一下本题与279.完全平方数中的的动态规划用法: 拿dp[ 10 ]的推演途径来举例 279: 从 10 - 1,10 - 4,10 - 9 中取最大值 dp[ 10 ] = dp[ 9 ] + 1 dp[ 10 ] = dp[ 6 ] + 阅读全文
posted @ 2020-02-23 20:46 ChevisZhang 阅读(145) 评论(0) 推荐(0)
摘要:给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 初始思路: 给定一个数比如1300,1300下一步分解就有 int( 1300**(0.5) +1) 种选择,再下一步又有很多种选择,这样自顶向下的分解方法无疑 阅读全文
posted @ 2020-02-23 18:02 ChevisZhang 阅读(273) 评论(0) 推荐(0)
摘要:本题自己不会做,看的题解: (难点就是这个解题思路!) 1.遍历一遍 list ,保留两个指针,最小乘积和最大乘积,因为当前最大乘积一定在 curMax = max(curMax*item,curMin*item,item) 中 2. 设置 self.res, 每次遍历后都更新 self.res = 阅读全文
posted @ 2020-02-11 19:45 ChevisZhang 阅读(178) 评论(0) 推荐(0)
摘要:https://leetcode-cn.com/problems/house-robber-ii/ 思路: 1. 题目求数组非连续元素的最大和,状态转移方程为: dp[n] = max(dp[n-1],dp[n-2] + num) 2. 第二题要求 取了第0号num就不能要最后一项num,我就正反算 阅读全文
posted @ 2020-02-01 20:33 ChevisZhang 阅读(155) 评论(0) 推荐(0)
摘要:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 法1:暴力法,三层遍历,两层头节点尾节点,再用一层判断是否是回文 法2:动态规划,两层遍历,两层头节点尾节点,判断是否为回文可以直接访问 dp[i][j] , 这样就用 n^2的空间 换了 n的时间 本题我用的 阅读全文
posted @ 2020-02-01 15:53 ChevisZhang 阅读(189) 评论(0) 推荐(0)
摘要:转自 https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-dong-tai-gui-hua-by-liweiwei1419/ 阅读全文
posted @ 2020-01-30 19:45 ChevisZhang 阅读(178) 评论(0) 推荐(0)