本文主要是介绍20210828每日总结,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
#每日总结#20210828
-
最长递增子序列 vs 最长连续递增子序列
- 前者不要求连续,dp[i] 的状态是由 dp[j] j < i推导而来 求取dp[j]+1 的最大值
- 后者要求连续,dp[i] 就是由 dp[i-1]+1 推导而来
-
最长公共子序列 vs 最长重复子数组
- 前者不要求连续,分类讨论 俩数组i-1 和j-1位置是否相等,相等则dp[i-1][j-1] + 1; 否则分别各退一步 [i][j-1] 和 、[i-1][j]取最大
- 后者要求连续,dp[i][j] 就仅仅依赖于dp[i-1][j-1] + 1
-
判断是否是子序列 vs 子序列出现几次
- i-1为结尾的s1和j-1为结尾的s2,相同子序列的长度为dp[i][j],分类讨论s1[i-1] s2[j-1],相等则dp[i-1][j-1]+1 (都退一格比较结果+1),不相等则dp[i][j-1] (s1不动,把s2删除一格,比较结果)。最后dp[-1][-1] 和s1长度相等即可匹配。
- 问出现几次,dp[i][j] 代表s i-1结尾子串 出现 t j-1 结尾子串 的个数,要分类讨论:
- s[i-1] t[j-1] 相等:
- 用s[i-1]来匹配:dp[i-1][j-1] (都退一格)
- 不用s[i-1]来匹配:(意味着用s的前面来匹配)dp[i-1][j] (s仍然退一格,t不动)
- s[i-1] t[j-1] 不相等:
- 初始化 dp[i][0] s可以删元素,出现空字符串的个数 1;dp[0][j] 空字符串删除元素出现多少个t j-1:0;dp[0][0] = 1
-
两个字符串的删除操作:考虑相等、不相等(删一个,删两个取最小)
-
终极boss 编辑距离
- 增加和删除 在编辑距离上等价。只考虑删除(删一个),两个都删的情况不考虑,因为这种情况应该用替换,会比都删少一步。
-
回文子串数量:双指针结合动态规划,区间[i, j]内判断,i从尾到头,j从i到头。因为dp[i][j] 依赖于dp[i+1][j-1]
-
单调栈:用于寻找一维数组中,左边或右边第一个比自己大or小的元素位置。
- 单调栈里面存放数组的下标
- LC739,每日温度,寻找右边第一个比自己大的元素,需要一个递增栈(从外往里越来越大),不断更新数组下标
- LC496,下一个更大元素,同样维护单调栈,在nums2遍历寻找。
- LC503,下一个更大元素2,循环数组,遍历2倍len(nums),下标以i%n的形式。
- LC42,接雨水,单调栈从外往里越来越大,找 高-低-高的结构求凹槽面积
- LC84,矩形最大面积,跟接雨水反着。值得注意的是在首尾加了两个0,目的是遇到单调上升的矩形,也能构造出低高低的结构求面积。解法真的巧妙,明天再复习一遍。
这篇关于20210828每日总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!