开个帖子 记录刷题过程。

由于是转码 也深知代码能力的重要性 但之前断断续续的刷总觉得没什么长进 今天痛定思痛 决定开一个帖子 用来记录我的刷题过程 以此监督自己 。

2023.5.15

 今天练习了贪心思想 目前我觉得比较关键的点是 排序 与 搞清楚贪心的对象。

455没有什么好说的 435需要明白 我们需要贪边界最小 这样后续就可以容纳更多的区间 452射气球还是排序后 贪最小的边界.

406还是有些不太明白


2023.5.30

该死啊 中午电脑死机我直接重启 忘了 这篇博客还处在编辑状态 导致15号至今的刷题记录没了 无奈从头开始 这段时间先是学习了贪心思想 然后继续做算法思想的题时 猛然发觉自己关于数据结构的题已经记忆模糊了 于是直接找到跟着刷题的目录里的数据结构篇章 从链表开始刷 在做的时候 发现大佬的做法都是使用递归来解决 代码很优雅很简洁 我又去认真学习了递归 学习博客放这里 这篇博客写的十分好三道题套路解决递归问题 | lyl's blog 

543 二叉树的直径 细节处自己考虑的不是很清楚 


2023.6.1

昨天实验室研三师兄们回来了 去拍照 去听毕业答辩 去做课程作业 226翻转二叉树 用递归 但说实话 我虽然做出来 但对其中递归的步骤却是手推了一遍才明白过来 搞清楚你这个递归函数在干什么 我觉得有利于写出递归 617合并二叉树 在写每一级递归应该干什么的时候还是太过于瞻前顾后 递归应该只专注于当前 


2023.6.3

昨日上课+谢师宴 喝多了 112 路径综合 还是使用递归 自己写的思路大致没问题 但细节上还是有欠缺 用例没全通过 437路径总和 没做出来 简单的想法是进行双重递归 第一重遍历所有节点 第二重在每一个节点上 当做根节点计算路径和 时间复杂度很高 难一点的做法是利用前缀和来做 很妙


2023.6.4

572 另一个树的子树 我的想法是使用两重递归来做 但没有写出来 看了题解与评论发现这道题还有更高深的方法 看懂了dfs+kmp的方法 但是没看懂第三种 101对称二叉树 想用递归解决 还是没能做出来 评论有一大哥说的很对还是没有深刻理解递归思想111二叉树最小深度 这道题之前用递归做过 又重新做了一遍 做出来了 还不错 看了题解发现可以用广度搜索 更简洁404 统计左叶子节点的和 将判断条件写的不对导致第一遍没做出来 看了评论进行修改


2023.6.6

昨日与导师讨论了论文 改了算法 在跑实验。

687最长同值路径 这道题还是利用递归来做 评论给出的分析很清晰 每一层递归 我们只需要判断左子树和右子树是否和当前节点相同 相同+1 利用静态变量始终保存最长路径 返回值是左右子树的加上当前节点的最大值 很清楚337 打家劫舍 很难 看了题解恍然大悟 用unordered_map来记录当前节点偷与不偷的值 返回最大的671二叉树中第二小的节点 由于题目设置 只需要找到第一个比根节点大的就可以 最小的一定是根节点


2023.6.7

637二叉树层平均值 使用层次遍历就可 513找树左下角的值 层次遍历+记录每一层最左边的值144 实现二叉树的前序遍历 我刚开始使用了递归 然后又用非递归方式重写了一遍 对于非递归方式没太掌握 继续学习一下 ps是chatgpt给出的代码有点高端 没看明白 换了种方式就懂了145后序遍历94中序遍历 都用了递归和非递归写 理解到 递归本质就是利用栈的特性 可以将递归转换为栈结构写出来


2023.6.8

669 修建二叉搜索树 一开始没想到递归 该死a 之前遍历惯了 一上来就想着利用层次遍历挑选节点然后重新组成bst 但这样做报错栈溢出 没找到原因 一看评论 递归真实又简单又好懂a 230二叉搜索树第k小节点 我直接中序遍历得到一个数组 属于笨办法了 高明一点的解法是每颗子树上的节点和k去对比 以此确定要找的点在左右子树哪一个里 递归解决 235二叉搜索树的最近公共祖先 当想明白 利用bst的性质 若两个点的值都小于当前root值 那么一定在root的左子树中 大于就在右子树中 若一大一小 则当前root即为最近祖先 想明白这个就立刻用递归能做出来 236 二叉树的最近公共祖先 做了之前那道 满脑子是递归 但找不到可递归的点 被上一道紧固思维了 看了评论才反映过来


2023.6.25

这段时间没有刷题 主要原因有三个 一是之前参加的一项比赛快截止了 我们参赛的东西还没做出来 加了一段时间的班 在搞比赛项目 二是论文写作写到实验部分 制表学习latex 画图等等一系列事情 三是和同学一起接了一个小程序开发 需要学一些东西

现在比赛项目交上去了 论文实验部分也写的差不多了 目前就剩小程序开发以及论文motivation的书写 想了想还是每一天花一些时间进行做题吧 明天重拾 加油


2023.6.26

108有序数组转换为二叉搜索树 题目不难就是长时间没写c++了 手有点生 好多东西模糊了比如 容器vector的长度是size还是lenth 109有序链表转换为二叉搜索树了 看到第一想法是链表转换为数组直接套用上一题 用链表的方法没想出来 看了评论 很经典 快慢指针找到链表中点 进行切割 当前节点为root 递归进行左右子树


2023.6.27

653两数之和 查看二叉搜索树里有无两个元素之和等于特定值的 感觉不难 但是没有做出来 用中序遍历得到一个升序数组后利用双指针就可 我陷入了牛角 一直想着它肯定要包含头结点 530求二叉搜索树的最小绝对值 照搬上一题做法 遍历得到数组然后再找 但是应该可以 用递归或者迭代来做 因为这个差值要么是当前节点减去左节点 要么是右节点减去当前节点 针对每一个节点都是这样的操作 但是没写 之后二刷可以试试 感觉关于在一个树里找什么值 都应该考虑树里的数据大小关系 组成一个数组来做 但这个做法比较浪费空间 501二叉搜索树里的众数 还是二叉搜索树的性质 但我是保存了数组然后再去遍历 费时费空间 看了题解 可以边遍历边用几个变量进行维护更新 很细节


2023.6.30

前两天没做是因为论文草稿就差introduction 和 related work 部分了 这两个部分至关重要 整理思路好就得立刻写 中断的话 又需要重新捋一遍 再加上每次写的差不多就到一起做小程序的时间了 导致没时间做 208实现Trie前缀树 想着很复杂 没有头绪 一看题解 瞬间觉得自己是煞笔 认真想应该可以做出来677 取巧做了 并没有使用前缀树特点


2023.7.1

树的篇章写完了 开始栈和队列 232利用栈实现队列 没什么好说的 一个输入栈一个输出栈225利用队列实现栈 155最小栈 本来使用了数组来维护最小值和次小值 结果发现并不合理 想着应该要使用两个栈来实现 看了评论 发现使用一个链表即可实现 很巧妙


2023.7.2

20有效的括号 我是用遍历字符串 遇到左括号就入栈 遇到右括号就将栈的第一个拿出对照 看了评论 发现还有更简洁的方法 739每日温度 使用了一个辅助栈将序号压入栈中 小于栈顶的序号都入栈 遇见大于的就挨个分配栈顶的序号  


2023.7.3

503 下一个更大元素 这道题一上手就觉得熟悉 想了想和昨天做的每日温度如出一辙 都使用单调栈作为辅助 但做了半天总还是差一点 看了评论发现是判断关系没搞明白以及循环终止条件有点问题1两数之和 开了新模块 哈希表 结果回到了第一题 大多数人的LeetCode做得第一道就是第一题两数之和吧 看到我之前的回答(还是错的)有种梦一样的感觉 217存在重复元素 使用了unordered_map 看了评论发现使用set容器的唯一性再对比长度更简洁 594最长和谐子序列 我是采用了map容器 它的key是有序的 然后遍历一遍 若是key差值==1 则将他们的value相加 看了评论发现先排序使用双指针 类似滑动窗口就可以实现 省去了空间 很妙 128最长连续序列 题目要求时间复杂度需要O(n) 也就是不能sort 继而想到使用set容器去做 我的做法是遍历set 若是前后两者差值为1 用一个变量记录此时的序列长度 另一个维护序列长度最大值 看了评论 遍历set的方法比我巧妙 


2023.7.4

242 有效的字母异位词 我被束缚住了 看到第一眼想到的就是利用map来做费空间费时间 看了评论只要将两者进行排序后看看相不相等就可 字符串就是另类vector可以将一些常用处理方法利用到上来

409最长回文串 简单题 我没做出来 利用了map但不知道怎样处理多个奇数的值 看了评论一老哥的解法 很妙 

205同构字符串 我是用了一个map 但耗时长一些 题解用了两个map 耗时比我短一点 

647回文子串 暴力解O(n^3) 看了眼官解 有O(n^2)是找回文中心点 然后向两边一一比对 还有使用dp的 但是dp思想还没认真学 


2023.7.5

9 回文数 看了眼提交记录 是22年刚接触LeetCode 时做得 看了眼代码明显是cv上去的 重新做了一遍 有些细节问题没处理清楚 导致没通过全部用例 看了评论 发现还是网友妙a 反转一般的数跟前面剩的做对比就可 时间空间复杂度都很低

696计数二进制子串 个人感觉难度应该是med 看了评论才做出来 记录连续相同数字的个数 要是发生改变 就比较当前数字个数和上一个子串的长度 很妙

283移动0 我用了双指针来做 看了评论 高赞是也是双指针 但是比我巧妙很多 本来需要两个数组保存 现在通过双指针保存在一个数组里面

566重塑矩阵 我的做法属于暴力了 做了一半直接看题解了 很妙 学到了 将二维数组压扁为一维数组  , 所以 二维数组化为的一维数组中第x个元素 就可以又映射回去  那么我们现在可以实现由二维数组映射到一维数组再映射到二维数组 省去中间一步 直接两个二维数组进行映射


2023.7.31

不多数 这二十天里去了杭州参观了华为 完成了论文给老师修改了 参加了互联网+比赛 做得时候就觉得不靠谱 被告知没有获省奖 去了趟重庆和发小玩了一周 然后回学校又遭遇台风杜苏芮 今日开始学习

378有序矩阵中的第k小元素 没有做出来 看题解使用了归并排序 建议去做 23合并多个有序链表 我又去做了这个 这应该是第一次靠自己写出的困难题 但是没用到归并的思路 学习到的 c++里的priority_queue其实现原理就是堆排序 可以十分方便的实现归并排序这一操作 优先队列可以根据自己的需要改变优先级 学到了

645错误的集合 很简单的思路 很魔鬼的细节处理

287寻找重复数 很经典 读懂题目很简单 但解决感觉很难 看了题解 选择了二分法解决 虽然整个数组是无序的 假象一个具有单调性的数组 因为题目给出数组中包含了1--n+1的数 所以mid=l+(r-l)/2在数组中<=mid的数应该有mid个 若是>mid个说明重复数字在l--mid之间 反之若是小于mid则重复数字在mid+1--r之间


2023.8.1

667 优美的排列 没看懂题目 看了题解也没看明白要干什么 不过看构造出的数组觉得这也没优美到哪里去a 崩溃了

697 数组的度 题目看懂其实挺容易的 但做出来费了点功夫 我定义了一个结构体包含了节点出现次数以及第一次出现位置与最后一个出现位置 使用了map容器保存 看了题解应该用unordered_map保存会更快


2023.8.5

这几天的没有发布 就是草稿状态 结果windows又自动更新重启了 习惯不好 导致每一天的刷题记录都丢失了 现在每天都发布 前两天做完了数组和矩阵 开始做图了 果然很难 印象较深的操作是 遇到0-n-1分布的数组 记得下标和 与 值和是相同的这一性质

207 课程表 自己写了二十分钟左右提交发现是错的 看了用例 发现问题还不小 果断看题解 很妙 我将题目理解成 找到有向图中满足num的非环路径 这个理解就出现了问题 题解对题目的转换为 拓扑排序 找到每一个点的出入度 每次将入度为0的加入队列 然后将他们的后续课程的入度都-1 直到最后 若入队列的课程数小于num 则false 推敲一遍 就会发现只有入度为0的才能进入队列 若出现环或其他 就不能使得队列元素个数==所要学习课程数


2023.8.6

210课程表二 这道题和昨天做得207解决方法几乎一模一样 只不过需要记录下学习路径 我写了大半部分 始终编译出错 问了gpt 发现我的思路没错 就是细节处理上 导致溢出了 很难受 这两道题都属于拓扑排序 摸清了拓扑排序的路子

684 冗余连接 有点想法 但不知道如何下手 一看评论 发现这都是套路 直接并查集往上套 看到题解一个大哥说的 无向图连通性 考虑 并查集 有向图依赖性 考虑 深度广度优先 拓扑排序 总结的很好 现在我也略微懂了点套路

461 汉明距离 开始位运算篇章了 专门去复习了一下位运算 结果这第一道给我干蒙了 只能想到最原始的 利用字符串来对比 一看题解 又变成妙蛙种子了


2023.8.7

268 丢失的数字 没想到位运算的做法 直接排序之后对比下标了 

260 只出现一次的数字 首先就想到哈希表 位运算太太太难了 

190 颠倒二进制 官解秀翻我了 没看明白 抄了评论了一位老哥的做法 也很巧 

突然明白了为什么异或操作可以不使用额外变量实现两个变量的交换 设a=A,b=B a^=b-->a=A^B, b^=a-->b=B^A^B=A,a^=b-->a=A^B^A=B  太妙了!!!

231 2的幂 我采用了类似190题那个老哥的做法 将n一位位判断是否为1 看了官解不太明白为什么n&(n-1)==0就代表这个数就是2的幂 问了gpt才明白 若n是2的幂 例如n=4 -->0100, 此时整个二进制串中只有一个1 n-1=3-->0011 原有的1变为0之后的位都变为1 这也代表着此时n 与 n-1 的两个二进制串没有一位是相同的 所以两者& 必然为0


2023.8.8

342 4的幂 我原想用231的方法去试着做 结果行不通 那我就在想 一个数是4的幂肯定是2的幂 上一道题的答案只能用来作为一个判断条件 看了题解知道 应该将目光放在二进制中1所在位置上 是4的幂二进制中只有一个1 肯定在奇数位上 所以构造一个(101010.....)的数 进行与运算

693 交替位二进制数 参考上一道题 我想到了用1010或者0101来进行&运算 但是做了半天发现不行 看了题解 着实妙 若一个数为交替位二进制数 那么它右移再异或 就会变成全1 这时进行+1则都会变为0除了最高位 再进行&运算即可


2023.8.9

476 数字的补数 我是用了自己的方法 首先判断出n的有效位是多少 然后将n取反 在构造一个只有有效位是1其他都是0的二进制串 与取反后的n进行&运算 结果就是补数

371 两数之和 使用位运算 看完题解我都是懵的 翻找评论里有无老哥解惑 果然找到了让我虎躯一震的解释 两个整数a, b; a ^ b是无进位的相加; a&b得到每一位的进位;让无进位相加的结果与进位不断的异或, 直到进位为0;


2023.8.11

昨天做了4道 我记得走之前点了提交成功 今天来不知怎么又不见了 但是无妨 我本身开这篇博客也不是做给别人看的 做就是做 没做就是没做 对自己负责就可以了

213 打家劫舍环形街区 是昨天做得打家劫舍进阶版 房屋排列首尾相连了 我苦于不知如何将昨天的思路套进去 一翻评论 一老哥说 分为两种 一种是打劫[0,n-2]一种是[1,n-1] 豁然开朗 最后提交没通过 是细节出了问题 认真阅读了题解 对dp的理解更深了一点

64最小路径和 虽然是medium 但是思路很清楚 用传统dp就可以解出来 状态转移方程也很好推理 我是申请了dp的空间 但是看了题解 发现直接在原矩阵上进行覆盖也可以 节省了空间 

62不同路径 传统dp 但是这次我想着怎样进行优化 通过方程知道只跟两个数相关 但不知道如何维护更新 看了题解才明白 


2023.8.13

昨日实验室断电维修 给自己放了天假 

303区域和检索 是easy题 我暴力做出来了 一看题解明白这题是让我们学习 前缀和 这个概念 

413 等差数列划分 dp数组记录当前元素 所能构成的等差数列个数 没有弯弯绕绕 但是在状态转移方程上我想的有些出入 但好歹做出来了

343 整数拆分 这道题没有做出来 主要是想不明状态方程应该怎样构建 题解算是看明白了 


2023.8.14

本来是要做279 按平方数分割整数 但是看了半天不太懂 翻开评论看到这属于完全背包问题 随即看到了代码随想录的题解 说是这道题其实就是322 零钱兑换的变体 我去b站看了322 的讲解视频 将322先做了一遍 讲的很透彻 可以跟着代码随想录的刷题顺序往下做 

279 按平方数分割 我是shab 思路明明一样就是没做出来 绕了一大圈 我是shab


2023.8.15

91 解码方法 知道用动态规划做 但是没想出来状态转移方程 尝试了好几次 用例都会有出错的 最后看了题解 发现一开始我想状态转移方程的思路就错了 想要归纳总结但有一种说不清道不明的感觉 下次遇见应该可以做出来了

300 最长递增子序列 没有dp出来 看了题解才明白 是遍历每一个从0-i-1的 来更新dp 很妙 题解还有二分+dp的做法 更看不明白 c 准备跟着代码随想录 先刷一遍他的题 循序渐进一下 

讲的确实很不错 跟着carl把dp的题做过去


2023.8.16

70爬楼梯 重新做了一遍 结合着视频讲解 把这道题吃透彻了

746 花费最小爬楼梯 想的很清楚 但是曲解题意了 cost[i]是到达第i个楼梯向上爬支付的费用 我理解为 到达第i个阶梯需要支付的费用 所以我的状态转移方程写为了 dp[i]=min(dp[i-1],dp[i-2])+cost[i] 但是实际上应该是dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])天差地别了属于是


2023.8.17

62不同路径 很清楚的做出来了 有点察觉dp的味儿了

63不同路径II 中间有一点想复杂了 但还是做出来了  看了题解直接注释掉了没必要的代码 运行时间也少了


2023.8.18

343 整数拆分 又重新做了一遍 看了眼第一次做的题解 是抄上去的 这一次虽然没有做出来 但是步骤清晰了很多 只是状态方程想的有点问题 我的是dp[i]=max(dp[i-j]*j,dp[i]) 而正确的应该是dp[i]=max(dp[i],max(dp[i-j]*j,(i-j)*j))两个一对比 就发现了问题 我的默认将一个数拆成三个或三个以上了 而正确的应该从拆分成2个开始考虑 

96 不同的搜索二叉树 每当我感觉要摸出dp的门路了 总是给我当头一棒 这道题我状态转移方程没有想出来 我都想到以不同的值作为根节点然后去考虑 没有想到左右子树的布局其实和之前的状态相关 这样看来 这道的状态转移我是完全没懂 刚看carl的做题思路 就猛然醒悟了


2023.8.20

昨日惯例休息一天 今天早上第一次参加周赛 不出意外 两题选手 第三道清楚应该用dp可以做出来 但是不知道怎样构建方程 第四题看了半天没有思路 准备待会搞完小程序的事 有时间看看周赛讲解 晚上约了球 没时间就明天吧 最近导师改小论文 需要我补的东西很多 要补一个大章 加实际应用 这个还得需要做实验然后做对比 很麻烦 


2023.8.21

通过看讲解视频基本上看懂了第三题的dp 但是还有两个小细节没有搞明白 发了评论问一下网友 希望能得到解答
看carl的背包问题讲解视频 讲的是真透彻 看完后 看看有无时间做一两道


2023.8.22

416 分割等和子集 这道题被列为dp 我确实有些懵 不太清楚怎么考虑用dp去做 果断点开carl视频听了下思路 直接转过头用01背包的滚动数组模版做出来了 还得做几道题熟悉熟悉才行


2023.8.29

去深圳参加了一个会议 这五天时间没有做题(23号做了一道1049 最后一块石头重量II 忘了记录) 今天继续

494目标和 六天没有做dp了 手果然生了 没做出来 看视频才明白 现在发现状态转移公式并不难 真正难的是如何意识到这个问题可以使用背包思想来做 尤其是dp数组的定义 我做494时 我明确告诉自己这是01背包但仍然不懂这个dp数组应该怎样定义 

听了视频发现01背包的考察大致分为:纯01背包问题就是求得容量下最大价值 416这是能不能装满这个容量 1049是容量下最多能装多少重量 而494则是装满这个容量有多少种方法

474 一和零 这道题很容易就能想到背包 只不过是个二维的 背包的容量为两个维度 我刚开始将这俩维度写在了一个for循环里 报错 看了讲解才明白 应该类似之前那样一个维度一个循环 总的来说这题不难 但是第一次出现了二维的容量 很新奇


2023.8.30

518 零钱兑换II 是第一道完全背包类型题目 自己解了二十分钟没解出来 原因是状态转移方程没想出来 看讲解 说是与昨天做得目标和几乎是同一道题 我立马去回顾了昨天的494 直接cv了状态转移方程 直接通过........ 看来我总结的还是不够

377 组合总合IV 这道题刚好是上一道题解中说到的 若是先背后物就会有重复的组合出现 所以上一道的遍历顺序只能是先物后背包 这道题只能是先背包后物 很经典 不过有个用例很恶心 其余的没什么难的 只要听懂了上一道的讲解


2023.8.31

322零钱兑换 重新写了一遍 看待问题的方式不一样了 只能说这段时间刷dp还是有些效果 自己写出来了

279完全平方数 也是之前做过的一道题 但是这次做 忽略了平方数这个概念 导致提交一直出错 看了之前的代码 才明白过来 

139单词拆分 每每认为自己对dp有所了解后 开始一道新的应用 就被打回原形 这道题我看出dp数组的含义 但就是状态转移方程想岔了 正确的思路是 背包是给定的字符s 物品是每一个位置上截取的每一个字符串 我的错误想法是将给的字典里的每一个字符串当成了物品 这样想应该也能写出来 但是需要考虑的东西大大增加
排列数 先背包后物品

组合数 先物品后背包


2023.9.1

对之前的背包问题 做了一个小总结:
开个帖子 记录刷题过程。_第1张图片

198打家劫舍 又是一道之前刷过的题 这次计时了 花了8min 应该可以更快 但是初始化哪里以及数组越界处理花费了点时间 以后做题都使用计时吧 以前太拖拖拉拉了

213打家劫舍II 之前也做过一次 印象比较深 20min 初始化哪里出了问题 到最后凭着感觉改了一下 结果通过了 带着疑问去看讲解视频 发现carl的思路真清晰 我设置了两个dp数组 那其实将198的代码封装成函数 在这里只是考虑不同范围的nums数组而已 很巧妙 这个思路也解决了我初始化的问题


2023.9.2

337打家劫舍III 进了贼窝了这是..... 这道题难以置信显示我已通过 点开题解一看 6.6号做了的 当时没学dp估计cv大法 思考了十来分钟 不知道应该如何下手 果断看了视频 讲的很清楚 不过我觉得 做这道题需要对递归和dp以及二叉树都要有一个清晰的认知 才可以做出来 难度mid我觉得不合适

121买卖股票的最佳时机 一看后面的几道题全是股票买卖 从贼窝出来又上赌桌了 这道简单题之前做过 一看提交记录 好家伙 做了还不止一次 3月份的事了 本来想用dp试一下 但发现双指针似乎更简单也更高效 花了8分钟 通过后又尝试着用dp做出来了 也没想到提交通过了 

.......原本不准备看讲解 结果有15分钟 心想这么一道题讲15min 有什么我没注意到的点吗 点开看完后 才发现 我所谓的dp做法实际上是贪心....是我太菜了

122买卖股票的最佳时机II 看了上一道的dp思路 这一题有些想法 尝试了一会 发现状态转移方程有几点比较模糊 看了一下思路 改了几处立马通过了  但是总的来说 这道题使用贪心效率会更高 我直接累加每次的正利润即可 但是贪心只能运用于具体场景 这一系列的买卖股票没法用贪心思想传承做下去


2023.9.3

今天做了周赛 从两题选手退化成一题选手 这一题差点没做出来...... 第二道感觉可以用dp做 但是具体细节还是没有考虑清楚 比如怎样删除才能满足条件 明天有时间一定得好好看看题解


2023.9.4

2844 生成特殊数字的最少操作数 这是昨天周赛的第二道题 看了视频 看懂了思想但是不知道怎样写出代码 最后copy了大佬的代码 用了枚举每一种字符串出现的可能 贪心的找到满足整除25的最少操作数 但是处理细节 还是有些没想明白 已经提了问 坐等大佬解惑


2023.9.5

123 买卖股票的最佳时机III 是一道困难题 我的想法是至多两次交易 我分割为一次和两次 一次就是普通的股票交易问题 两次交易我将数组分割为两部分 每一部分进行一次普通股票交易 提交只通过了205个用例 时间超了 看了评论 发现我这个思路有点岔子 正确的是 以每一点作为分割成两个数组算前后两个数组的最大利润 当切到第0位时 就是整个数组 

用dp来做 需要定义多个状态 carl讲的很清楚 按照他的思路 提交没问题的只不过时间复杂度高一点

188 买卖股票的最佳时机IV 几乎是123题的翻版 条件从2次变为了k次 加个for循环即可


2023.9.6

309 买卖股票的最佳时期含冷冻期 这道题就是股票II加了一个冷冻期的设定 我的思路是分类来讨论 第一天买或者不买 因为这涉及到第一天初始化的问题 看了视频讲解 是将每一天分成了4个状态 然后老一套方法去做 思路很清晰

714 买卖股票的最佳时期含手续费 秒了这道题 原以为手续费是百分比 这样结果是一个固定的费用 那直接将费用规定为买入的时候付 就与普通股票题没什么区别了 看了眼通过的人 几乎都是滚动数组来做很快很省空间

300 最长递增子序列 之前做过的题 但还是不会做 复盘了一下问题是dp数组定义不对 以及转移方程没写出来 看了carl视频才明白 这是dp的另一个系列问题 明天再好好研究一下这道题


2023.9.7

复盘了一下昨天的第300题 我的dp[j]是前j个元素构成的最长子序列 而答案的则是 以nums[j]为结尾的子序列所构成的最长子序列 不同在于 nums[j]是否必须可选

674最长连续递增子序列 简单题 第一次看到这题我的想法就是遍历一遍而不是dp 结果画了一番功夫 没仔细考虑其中细节 最后也用dp做了一遍 dp数组定义为上面那样 很清楚就可以写出来


2023.9.8

718 最长重复子数组 这道题没想出来状态转移方程 看了讲解才明白过来 难点在dp数组的定义和状态转移方程 整体结构很简单

1143 最长公共子序列 与上一道题主要的不同就是上一道题要求连续 这一道不要求连续 这一特质决定了两者大概思路相似 但是好几处地方存在明显不同 1.718中 若n_1[i]==n_2[j] 那么dp[i][j]=dp[i-1][j-1]+1 就结束了 因为它是连续的 只用 i-1,j-1位来更新就行 但是1143这道不一样 若是n_1[i]==n_2[j] 那么与718一样 若是不相等 那么需要看dp[i-1][j],dp[i][j-1]这两个哪个最大了 这里疑问 为什么知识-1不看看-2 -3之后的子序列吗?是因为在迭代过程中 关于-2 -3等这些都被检查过了 2. 最终结果的存储地方不同  两题的dp数组定义都是相同 但718的子数组长度是连续的 所以重复子数组的最后一个数不一定就是两个序列的最后一位  1143这道不连续 那么无关紧要 我只看两个完成序列中存在的最长公共子序列

1035 不相交的线 跟上一道题一模一样


2023.9.9

53最大子数组和 之前做过的题 这次没做出来 看了眼之前的提交 应该是cv上去的 用的是前缀和方法 这次用dp 我没想出来状态转移方程 思路什么的都大差不差

392 判断子序列 这道题是简单题 看到第一眼就想到双指针去做 但是出在了dp章节里 我想着怎样用dp去思考 没想出来 看了讲解 发现这是dp编辑距离类题目的入门题目 这题和1143很像 但有一点不同的是 这个只能在一个字符串里进行删除字符 所以若n_1[i]!=n_2[j],直接为 i j-1 注意这道题对顺序还有要求 外层循环是子串 内层循环是主串 当顺序反过来后就出错 


2023.9.10

今天早上上班忘记参加竞赛了 那会试着做了一下 前两道很简单 第三道有点难度 看了评论说是要dfs 我正好不是很熟 所以大概率又是两题选手了 

115 不同的子序列 编辑距离类入门题目 我没有想明白状态转移方程 思路从392那道题中没有转变过来 导致做了半天没做出来 本来挺纳闷循环顺序 在看视频做出来之后 又尝试着将循环顺序反过来 发现也可以 只不过考虑的时候有点别扭 

583 两个字符串的删除操作 这是编辑距离类题目第一次自己做出来 我觉得考虑这类问题关键点就在于 哪一个可以删哪一个不能 dp数组中所存的值代表什么含义 搞清楚这两点慢慢分析下去就可以做出来

你可能感兴趣的:(贪心算法,算法)