算法记录
文章平均质量分 93
山药泥拌饭
这个作者很懒,什么都没留下…
展开
-
算法学习记录~2023.5.23~动规Day3~01背包理论基础 & 416. 分割等和子集 & 1049.最后一块石头的重量II
比较难理解的其实就是两个问题,第一个是一维 dp 时为什么背包容量要从后向前倒序,第二个是为什么两层 for 循环不能更改,即必须先遍历物品再遍历背包容量。在上面通过本质思路加上具体的实例推导证明了上面两个问题,后面再看这块可以着重再加深一下这里的理解。其他的地方问题并不大。关于最后的true false判断,我自己是直接写在了两层 for 循环里//01背包 vector < int > dp(10001 , 0);原创 2023-05-29 21:33:21 · 46 阅读 · 0 评论 -
算法学习记录~2023.5.22~动规Day2~62.不同路径 & 63. 不同路径 II & 343. 整数拆分 & 96.不同的二叉搜索树
力扣题目链接力扣题目链接本题的第二步递推公式的确定是个人感觉最难想到的,一开始自己完全没想到过这种细分方式。本题的递归方式又是自己一开始没想到。同时递归里的 for 循环终止条件以及 dp 递推公式的值一开始也没想清楚没有写对,对于这种情况还是需要多放实际的数进行模拟确认。原创 2023-05-26 23:34:04 · 289 阅读 · 0 评论 -
算法学习记录~2023.5.21~动规Day1~509. 斐波那契数 & 70. 爬楼梯 & 746. 使用最小花费爬楼梯
动态规划,英文 Dynamic Programming,简称DP。如果某一问题有很多重叠子问题,使用动态规划是最有效的。和贪心算法的区别在于:贪心没有状态推导,而是从局部直接选最优的;动态规划中,每一个状态一定是由上一个状态推导出来的简单题用来掌握方法论,困难题应用方法论。题目还是不难,因此重点还是在于更熟悉动态规划的思维和步骤。简单题,为了练习方法论,然后难度按梯度向上,一环扣一环。原创 2023-05-26 11:19:03 · 67 阅读 · 0 评论 -
算法学习记录~2023.5.20~贪心Day5~738.单调递增的数字 & 968.监控二叉树
力扣题目链接不愧是hard题.jpg。原创 2023-05-25 16:42:13 · 40 阅读 · 0 评论 -
算法学习记录~2023.5.19~贪心Day4~452. 用最少数量的箭引爆气球 & 435. 无重叠区间 & 763.划分字母区间 & 56. 合并区间
结合 134. 加油站 的类似错误经验,之后要尽量避免暴力枚举所有可能发生的情况分别处理,除非逻辑和可能的情况极其简单且确定,否则无论是效率还是准确率都非常难以保证。至于本题思路,比较好想到尽可能让更多气球重叠在一起,但是模拟处理的具体过程不是很好想,代码也不是很好写。一开始是按照左区间排序,但是判断时用的右区间排序才能实现的逻辑,这样就会发现需要考虑非常多特殊情况,也不是很对。其实碰到好几次这种题目了,多维度时不同排序方式有可能也对应着不同的遍历方向或者思路,比较容易考虑不清楚。原创 2023-05-24 16:07:18 · 111 阅读 · 0 评论 -
算法学习记录~2023.5.18~贪心Day3~134. 加油站 & 135. 分发糖果 & 860.柠檬水找零 & 406.根据身高重建队列
首先是按照思路1的时候,找代码错误找了一个多小时,最后发现是“?:”的语法记出问题用错了…因为一个非常低级的错误浪费了这么久真的很崩溃,尤其是发现这样还超时…思路2和思路3理解起来非常的吃力,这道题可能花了三小时才稍微理解了,而且感觉理解还是存在问题。这个情况来看很没信心之后遇到时候自己还能想起来。具体对于这两种思路的考虑和困难都写在上面对应思路的部分了。不知道是不是要考虑放弃下这道题,贪心算法真的就是一个萝卜一个坑没有任何题目之间能举一反三,自信心打击器了属于是。这道题目前可以标记为不会。原创 2023-05-23 18:12:28 · 64 阅读 · 0 评论 -
算法学习记录~2023.5.17~贪心Day2~122.买卖股票的最佳时机II & 55. 跳跃游戏 & 45.跳跃游戏II & 1005. K 次取反后最大化的数组和
力扣题目链接力扣题目链接一开始考虑的是找出所有能走到最后一步的路径,之后再找出步数最少的一个。但后来发现这样非常复杂,而且暂时没想出来具体解决方案。看了题解后才想到尽量使用贪心思路,改变思路考虑,一步一步地算,每一步考虑好最优解,最终就是全局最优解按照贪心思想考虑事件划分为小事件后的所有情况,然后再找到解决方案,一方面能解决问题,一方面能尽可能提高效率。原创 2023-05-22 10:29:35 · 65 阅读 · 0 评论 -
算法学习记录~2023.5.16~贪心Day1~455.分发饼干 & 376. 摆动序列 & 53. 最大子序和
贪心的本质是选择每一个阶段的局部最优,从而达到全局最优最优子结构:规模较大的问题的解由规模较小的子问题的解组成,规模较大的问题的解只由其中一个规模较小的子问题的解决定无后效性:后面阶段的求解不会修改前面阶段已经计算好的结果贪心选择性质:从局部最优解可以得到全局最优解正例:Q:有一堆钞票,可以拿走十张,如果想达到最大的金额,要怎么拿?A:每次拿最大的,最终结果就是拿走最大数额的钱反例(不符合应用场景):Q:如果是有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满。原创 2023-05-19 17:17:07 · 211 阅读 · 0 评论 -
算法学习记录~2023.5.15~回溯Day4~332.重新安排行程 & 51. N皇后 & 37. 解数独
第一次一天的所有题目都是hard…好在终于是过完一遍回溯了本题如果用map和set的解法目前自己来看还是太吃力了,无论是思路还是基础语法都非常模糊,花了很久其实还并没有搞懂。再刷时候可以考虑js的其他思路和解法力扣题目链接本题是第一次接触到二维递归,但其实仍然没有逃脱回溯三步曲的范畴。思考清楚每一步,想清楚怎样递归获取所有值,以及是否有特殊判定情况,即可解决。原创 2023-05-18 19:57:27 · 45 阅读 · 0 评论 -
算法学习记录~2023.5.14~回溯Day3~90.子集II & 491. 递增子序列 & 46.全排列 & 47.全排列 II
力扣题目链接本题使用了unordered_set去重。一开始自己想的时候看例子没能发现重复的问题,采用类似used去重的关键在于想清楚是要同一数层不能重复,这个在写代码时需要注意力扣题目链接这题看起来和 46.全排列 一样都用了used,但是由于使用了排序,那么代码中的逻辑就可以保证本树层不会重复放入相同元素。有关这种去重的问题还需要多练习和思考原理。原创 2023-05-17 04:22:36 · 144 阅读 · 0 评论 -
算法学习记录~2023.5.13~回溯Day2~39. 组合总和 & 40.组合总和II & 131.分割回文串 & 93.复原IP地址 & 78.子集
力扣题目链接力扣题目链接切割问题可以抽象为组合问题如何模拟那些切割线切割问题中递归如何终止在递归循环中如何截取子串如何判断回文本题下次还需要仔细看一遍,关于回溯函数里终止条件和递归过程中的具体数值模拟可以脑子里再自己想一下。第一遍时终止条件没有想太清楚,关于每一小段的ip地址的合法性验证也没有考虑全,再刷时需要靠自己注意一下。一开始想成了分别设置不同的节点范围,以这个范围大小一次次遍历找到所有符合的子集,然后再更改这个节点范围知道最终等于整个数组大小,这样就很复杂。原创 2023-05-16 16:24:23 · 102 阅读 · 0 评论 -
算法学习记录~2023.5.12~回溯Day1~77. 组合 & 216.组合总和III & 17.电话号码的字母组合
回溯法也叫回溯搜索法,是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯,所以回溯函数其实也就是递归函数。力扣题目链接力扣题目链接数字和字母如何映射两个字母就两个for循环,三个字符我就三个for循环,以此类推,然后发现代码根本写不出来,因此需要回溯算法输入1 * #按键等等异常情况(本题测试数据倒是不涉及)原创 2023-05-13 23:52:45 · 70 阅读 · 0 评论 -
算法学习记录~2023.5.11~二叉树Day9~108.将有序数组转换为二叉搜索树 & 538.把二叉搜索树转换为累加树
力扣题目链接思路较为简单,注意点第一个是关于取mid值时的溢出问题,另一个是处理左右区间的判断条件。迭代法中处理左右区间的条件自己第一次思考没太想出来,下次注意。原创 2023-05-12 14:36:03 · 79 阅读 · 0 评论 -
算法学习记录~2023.5.10~二叉树Day8~701.二叉搜索树中的插入操作 & 450.删除二叉搜索树中的节点 & 669. 修剪二叉搜索树
一上来很容易想到要重构二叉树,因而思考的特别复杂,但是由于二叉搜索树性质,一定能找到仍旧为空节点的属于目标节点的位置,因此其实并不需要重构,找到满足条件的空节点然后将目标节点插入为新的叶子节点即可力扣题目链接很容易犯只考虑当前节点的左右子节点,而忽略了他的子树不一定全都不符合要求。原创 2023-05-11 04:21:22 · 118 阅读 · 0 评论 -
算法学习记录~2023.5.9~二叉树Day7~501.二叉搜索树中的众数 & 236. 二叉树的最近公共祖先 & 235. 二叉搜索树的最近公共祖先
力扣题目链接求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。对于有序树,不需要回溯直接利用自带的方向性按序寻找即可,也因此本题迭代法显得更简洁。原创 2023-05-10 08:56:48 · 54 阅读 · 0 评论 -
算法学习记录~2023.5.8~二叉树Day6~617.合并二叉树 & 700.二叉搜索树中的搜索 & 98.验证二叉搜索树 &530.二叉搜索树的最小绝对差
力扣题目链接力扣题目链接二叉搜索树的中序遍历是有序数组需要意识到并且善加利用陷阱1非常容易被忽略,也就是只处理每个节点和它左右节点的大小关系,而忘了整个子树的所有节点和根结点的大小关系也需要确定。原创 2023-05-09 05:14:06 · 80 阅读 · 0 评论 -
算法学习记录~2023.5.7~二叉树Day5~106. 从中序与后序遍历序列构造二叉树 & 105. 从前序与中序遍历序列构造二叉树 & 654. 最大二叉树
分割时的区间问题是最大的难点,首先是一定要保持一致性,另外就是必须得熟悉使用的计算机语言的基础,了解诸如vector(begin(),begin()+ x)的x到底指什么(其实就正好相当于角标,从0开始),以及end()并不指向最后一个元素力扣题目链接难点还是在于区间的限制。本次解题采用左闭右闭,传入参数为实际的下标,因此在最开始传值时不能直接传整个数组的size,而应该减1。另外在循环条件的设置中也要考虑到right是可以达到的,所以不能用小于,而应该用小于等于。原创 2023-05-08 09:38:05 · 141 阅读 · 0 评论 -
算法学习记录~2023.5.4~二叉树Day4~404.左叶子之和 & 513.找树左下角的值 & 112. 路径总和 & 113. 路径总和ii
力扣题目链接不能判断当前节点是否为叶子节点时,可以考虑利用他的父节点进行判断。之前都是习惯了通过节点的左右孩子判断本节点的属性,此题打开了一定思路。下次可以再研究下递归解法力扣题目链接。原创 2023-05-07 02:10:24 · 73 阅读 · 0 评论 -
算法学习记录~2023.5.3~二叉树Day3~222. 完全二叉树的节点个数 & 110.平衡二叉树 & 257.二叉树的所有路径
本题考查了对于完全二叉树的理解,其中将问题分解为满二叉树和其他情况的思路需要学习理解。此题完全掌握递归其实就可以了,迭代了解思路即可。一刷没有用通用写法写出来迭代遍历,二刷试一下。或者继续熟练DFS三种遍历方式的非统一版迭代方法。原创 2023-05-04 03:36:05 · 44 阅读 · 0 评论 -
算法学习记录~2023.5.2~二叉树Day2~116.填充每个节点的下一个右侧节点指针 & 111.二叉树的最小深度 & 226.翻转二叉树 & 101. 对称二叉树
next关系则可以同时考虑保存前一状态,以与当前状态构建联系。本质考察的还是层序遍历力扣题目链接本题其实考察的就是二叉树的基础遍历方式。原创 2023-05-02 23:42:45 · 62 阅读 · 0 评论 -
算法学习记录~2023.4.28~二叉树Day1~144.二叉树的前序遍历 & 94.二叉树的中序遍历 & 145.二叉树的后序遍历 & 102.二叉树的层序遍历
和链表类似,但节点中多了两个指针,分别指向左子节点和右子节点int val;} };原创 2023-05-01 14:44:29 · 119 阅读 · 0 评论 -
算法学习记录~2023.4.26~栈与队列Day2~239.滑动窗口最大值 & 347.前K个高频元素 & 42.接雨水
两种方式其实思路一致,就是具体写法有细微差别。最暴力的解法很好考虑,就是嵌套两层循环,复杂度为O(n∗k)。本题巧妙解法的思路是通过维护滑动窗口中的元素,每进入一个新元素只对其进行处理,对前k-1个元素充分利用上一次的处理结果,同时根据题目要求将其构造成单调队列以方便直接获取题目要求的最值。当一个新元素进入时如何找到它应该在的位置,也就是如何去构造满足要求的单调队列是解题关键求前 k 大,用小根堆,求前 k 小,用大根堆。原创 2023-04-27 19:20:19 · 68 阅读 · 0 评论 -
算法学习记录~2023.4.21~栈与队列Day1~232.使用栈实现队列 & 225.用队列实现栈 & 20.有效的括号 & 150. 逆波兰表达式求值
抽象化理解栈和队列有助于思考这道题尽量复用逻辑功能类似的函数,并且不要通过复制粘贴的方式入栈:同队列出栈:使用第二个队列用于备份原队列中除了需要被pop外的其他所有元素,此时原队列剩下的即为所求值,最后再从备份队列中复制回去,并清除备份队列栈顶:即为队列尾判断为空:原队列为空则为空力扣题目链接由于栈结构的特殊性,非常适合做对称匹配类的题目。主要需要分析出特殊情况有哪些以及怎么处理。此解法非常暴力但思路非常清晰。不过使用replace不符合力扣的要求,同时这样也会极大增加时间和空间复杂度。原创 2023-04-21 18:53:07 · 189 阅读 · 1 评论