20210828每日总结

2021/9/17 23:35:16

本文主要是介绍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] 不相等:
        • s一定要退一格比较 dp[i-1][j]
      • 初始化 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每日总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程