- 博客(46)
- 收藏
- 关注
原创 代码随想录算法训练营第五十五天|42. 接雨水 84.柱状图中最大的矩形
踩坑:st.push(0)写成st.push(height[0])了思路:本题向我们拓展了单调栈的性质,栈口元素左边下一个更大的元素就是栈中其下的第一个元素。这样我们就能在遍历的过程中不断求出以栈口元素为底的凹地。
2024-08-01 19:00:20
302
原创 代码随想录算法训练营第五十三天|739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II
踩坑:MD break当成continue了思路:单调栈问题的核心就是构建并利用单调递增或递减的栈。最近遍历的元素在栈口,将每次遍历到的元素与栈口元素比较是解题过程。具体到本题就是,当天的温度与最近的温度(栈口元素)相比,如果当天温度低则入栈(栈口到栈底递增),如果当天温度高,说明最近一天的解以满足,所以弹出栈口元素,继续比较,直到栈空或较低。
2024-07-31 22:43:55
393
原创 代码随想录算法训练营第五十一天|115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离
踩坑:看了视频,但还是没注意到题目要求里的取模操作,虽然说是取模,但应该是避免溢出,因此实际操作时改变数据类型即可。思路:核心是动态数组的含义与递推公式的理解uint64_t。
2024-07-27 14:56:31
357
原创 代码随想录算法训练营第五十天|1143.最长公共子序列 1035.不相交的线 53. 最大子序和 392.判断子序列
踩坑:看了视频,这种最长子序列的题向来是我的弱点,不过做了最长递增子序列,最长连续递增子序列,最长重复子序列,最长公共子序列也应该区分辨析一下了。int。
2024-07-26 16:44:37
442
原创 代码随想录算法训练营第四十九天| 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组
踩坑:本题细节众多,dp数组的含义,全部初始化为1,递推公式,最后结果等都是细节。
2024-07-17 14:26:23
336
原创 代码随想录算法训练营第四十八天|188.买卖股票的最佳时机IV 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费
踩坑:好久没刷题,把题目要求里的“你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)”当作不能在一天里多次买入卖出了。思路:与“买卖股票的最佳时机|||”一样,只不过变成了至多k次,注意循环即可。int。
2024-07-16 20:09:23
386
原创 代码随想录算法训练营第四十六天|121. 买卖股票的最佳时机 122.买卖股票的最佳时机II 123.买卖股票的最佳时机III
踩坑:和打家劫舍有点像当时有差别,一开始想用打家劫舍的dp数组含义,但是第 i 天买入,不买,卖出难以用前i-1天获得的最大利润表示。int。
2024-07-16 18:05:18
349
原创 代码随想录算法训练营第四十五天|198.打家劫舍 213.打家劫舍II 337.打家劫舍III
踩坑:很多坑,自动把它当作背包问题了,但其实这就是一个普通的动态规划题目,背包问题本质上是一个二维问题,只是可以简化成一维,想要抽象为背包问题首先就是要明确。而本题的dp数组的含义是dp[i]:[0, i]家能偷到的最大价值,其中并不涉及到背包大小。
2024-06-30 15:05:28
533
原创 代码随想录算法训练营第四十四天|322. 零钱兑换 279.完全平方数 139.单词拆分
踩坑:在初始化那里卡了好久,现在学到了,应该对0下标和非0下标分别讨论,0下标的初始化是为了递推正常进行,非0下标初始化是为了不要覆盖新值。思路:完全背包求装满背包最少的物品问题。
2024-06-29 15:01:01
263
原创 代码随想录算法训练营第四十三天|完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ 70. 爬楼梯 (进阶)
踩坑:先看了视频,没踩坑思路:一维01背包的倒序遍历改为正序遍历就是完全背包,即一个物品可以被选多次。
2024-06-28 14:41:02
409
原创 代码随想录算法训练营第四十二天|1049. 最后一块石头的重量 II 494. 目标和 474.一和零
踩坑:最后的返回值应该是sum减去已经凑出来的石头堆两次。思路:关键在于认识到不止两个石头的差可以得到,两堆石头的差也能得到。所以题目可以变成将这一堆石头分成两堆重量相似的石头。求解过程就变成了分割等和子集。
2024-06-26 16:45:22
436
原创 代码随想录算法训练营第四十一天|01背包问题 二维 01背包问题 一维 416. 分割等和子集
踩坑:在考虑当前物品时,应先考虑当前的背包能不能放得下当前物品int。
2024-06-25 16:06:18
626
原创 代码随想录算法训练营第三十九天|62.不同路径 63. 不同路径 II 343.整数拆分 96.不同的二叉搜索树
踩坑:二维的vector数组需要初始化,否则会报错访问空指针int。
2024-06-23 15:34:10
426
原创 代码随想录算法训练营第三十八天|509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
踩坑:dp[0] = 0真就是第零个斐波那契数等于0,不是第一个。思路:确定dp数组的含义:dp[i]:第i个斐波那契数递推公式:dp[i] = dp[i-1] + dp[i-2]dp数组初始化:dp[0] = 0;dp[1] = 1遍历顺序:从前往后。
2024-06-21 20:07:28
491
原创 代码随想录算法训练营第三十七天|56. 合并区间 738.单调递增的数字 968.监控二叉树 (可跳过)
踩坑:昨天做了重叠区间的题,所以没踩坑。只是我们写的代码有点冗余,建议看卡哥的。思路:首先对所有区间根据左边界从小到大排序,这样可以不考虑左边界的情况。依次比较相邻两区间的右边界和左边界,如果重叠则更新可覆盖区间的右边界。
2024-06-13 12:34:45
271
原创 代码随想录算法训练营第三十六天|860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
踩坑:以为不需要考虑具体怎么找钱,一直在从整体上想解决方案。思路:当客户支付5元我们只需要收下,当客户支付10元我们只能找零5元,当客户支付20元我们优先找零一个10元一个5元,如果不行也只能支付三个5元。可以看到所有的模式相对比较固定,所以可以直接模拟。
2024-06-12 14:36:36
398
原创 代码随想录算法训练营第三十五天|1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
踩坑:没有思路:数组里有正有负,肯定先对负数进行取反,且从小开始。如果所有负数都为正后还可以取反,则如果此时次数为奇数,将最小整数取反,如果为偶数,可以直接求和。
2024-06-11 19:02:55
345
原创 代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II
踩坑:差点陷入不必要的细节,比如怎么表现买入卖出,怎么体现同一天买入卖出思路:这里的股票买卖是看了天眼,明天的涨跌今天就知道,那肯定是如果明天涨了我今天才买,因此,将每天的价格可视化出来,统计所有单调上升的总和即可。
2024-06-09 16:08:24
334
原创 代码随想录算法训练营第三十一天|455.分发饼干 376. 摆动序列 53. 最大子序和
踩坑:无思路:让每个饼干满足其能满足的胃口最大的小孩以充分利用。
2024-06-08 16:19:26
385
原创 代码随想录算法训练营第三十天|51. N皇后 37. 解数独 332.重新安排行程
踩坑:先看了视频,没踩什么坑思路:类似于一种排列问题,只不过每个位置之间需要满足一些条件。用回溯法可以穷举所有的情况。
2024-06-06 17:48:53
269
原创 代码随想录算法训练营第二十九天|491.递增子序列 46.全排列 47.全排列II
踩坑:意识到了如果相同的数不挨在一起,used去重方式就没用了,也想到了应该可以另开空间来记录哪些元素已经被用过,后续树层便不能再使用。同时也想到了如果后下个元素比当前元素小则不放入path。但问题就是不知道这些逻辑应该放在哪里。。。思路:本题再一次加深了我对于程序执行与树状结构推进之间映射的理解。与使用used去重不同,本题需要在树层上避免重复取的元素不挨在一起,所以需要在每个树层上记录已经使用过的元素以保证之后不会再使用相同的元素(for循环代表着树层的开始,因此需要在for外申请空间)。
2024-06-06 12:07:32
453
原创 代码随想录算法训练营第二十八天|93.复原IP地址 78.子集 90.子集II
踩坑:一开始是自己做的,踩了不少坑,纠结到底是切割几次,在想如果切割4次,该怎么让第4次固定切在结尾。但其实切3次即可。不知道string类的insert和erase函数。stoi函数的输入要有效(不为空,不超过int表示范围,不掺杂非法字符)思路:与分割回文串类似,都属于切割问题,不同的是。所以整体上就是对字符串进行切割,对切割出的字串进行合法性判断,如果合法,在其之后insert逗点。回溯时erase逗点。且在切割三次后,对尾部字串进行合法性判断,若合法,则收集。
2024-06-04 13:34:54
315
原创 代码随想录算法训练营第二十七天|39. 组合总和 40.组合总和II 131.分割回文串
踩坑:把元素可以重复利用理解成每次向下递归时集合都是原始集合。但是其实这样会造成重复。思路:在向下递归时,开始的位置不再是当前元素的后一个,而是当前元素,即下一层递归也可以用当前元素。
2024-06-03 16:49:52
382
原创 代码随想录算法训练营第二十五天|216.组合总和III 17.电话号码的字母组合
踩坑:与“77.组合”很像,没踩什么坑,注意要传start就行。思路:经典回溯模板,值得研究的是剪枝策略,当剩余元素的最小值比还需要的总和大时可以结束(可以在for循环里剪枝,也可以在停止条件处剪枝),当剩余元素的个数不足所需个数时可以结束(for循环剪枝)
2024-06-01 14:57:48
431
原创 代码随想录算法训练营第二十四天|77. 组合
思路:回溯算法的经典例题。熟悉组合问题n叉树的构建。同时还引出了剪枝的操作,主要是在for循环的中间条件上动手脚。踩坑:要明确当前循环遍历的集合是什么以及要向下递归传递的集合又是什么。
2024-05-31 13:14:49
239
原创 代码随想录算法训练营第二十三天|669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
踩坑:意识到了需要删除节点,但是没意识到要递归的删除。同时,与删除目标节点的删除逻辑也不完全相同。思路:遍历二叉搜索树,遇到在区间之外的节点,若小于low则该节点的左子树肯定也都小于low所以只需要考虑右子树,大于high同理。这里如果按照删除目标节点的逻辑应该返回右(左)子树根节点,但是右(左)子树中依然有可能有超出区间的节点,所以要对子树进行递归,返回修剪后的子树根节点。
2024-05-30 15:26:11
414
原创 代码随想录算法训练营第二十二天|235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
踩坑:root->val在p和q之间时不需要再向下递归了,此时root就是最近公共祖先。思路:根据二叉搜索树的特性,可以在递归过程中选择递归方向(q和p均大于root,q和p均小于root,root在q和p之间)。需要注意的是,当root在q和p之间时,root就是当前最近公共祖先。因为再向下会错过q或p,向上root只能作为某棵树的子树。
2024-05-29 21:23:24
220
原创 代码随想录算法训练营第二十一天|530.二叉搜索树的最小绝对值 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
踩坑:关于递归函数需不需要返回值这一点还需要强化。当递归满足一定条件需要立即返回时,需要返回值,当需要遍历整棵树时,一般不需要返回值。思路:二叉搜索树中序遍历会得到严格升序序列,只需要用双指针记录相邻两节点的最小差值即可。
2024-05-28 16:45:01
406
原创 代码随想录算法训练营第二十天|654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
踩坑:跟前天的由类似,所以没踩坑。思路:跟一样,停止条件就是何时这棵树简单到可以直接返回就返回。其他时间都是分割数组,将左子树和右子树继续向下递归。
2024-05-27 18:35:39
543
原创 代码随想录算法训练营第十八天|找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树
踩坑:用层序没有坑。用递归需要思考的东西有点多,主要是需要记录当前的深度。
2024-05-26 18:43:18
426
原创 代码随想录算法训练营第十七天|110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和
踩坑:int只有在等于0的时候等同于false,负数也是true。思路:平衡二叉树==任意子树的深度差不超过1。所以要用后序遍历,在得到左右子树的深度后,如果已经不满足平衡二叉树则返回-1。
2024-05-26 13:14:44
475
原创 代码随想录算法训练营第十六天|104.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数
踩坑:先看了视频,需要辨析的就是树的高度(节点到叶子节点的距离)和深度(节点到根节点的距离)思路:这是一道用层序遍历解决过的问题。在此是为了练习递归。使用后序遍历可以求解高度,而根节点的高度恰恰就是最大深度,若使用前序遍历求解深度,则无法直接得到(根节点的深度为1)。
2024-05-24 14:17:03
336
1
原创 代码随想录算法训练营第十五天|102.二叉树的层序遍历 226.翻转二叉树 101. 对称二叉树
踩坑:先看的视频,没踩什么坑思路:核心是使用队列并记录每一行的size,在遍历本行的时候下一行就入队了。
2024-05-23 19:28:15
375
1
原创 代码随想录算法训练营第十四天|144.二叉树的前序遍历 94.二叉树的中序遍历 145.二叉树的后序遍历
踩坑:先看了视频,所以没踩坑,但是需要注意的是不要陷入回溯法的陷阱。
2024-05-23 14:57:44
393
1
原创 代码随想录算法训练营第十三天|239. 滑动窗口最大值 347.前 K 个高频元素
踩坑:一开始觉得很简单,暴力求解即可,之后看了视频,学习了思路。因为先看了视频,所以没踩什么坑思路:核心是怎么维护窗口内的数。固定窗口每次向后移动一格的行为很像队列,所以考虑使用队列这一数据结构。队列在push元素时,判断队尾元素是否大于新元素,若小于则pop队尾元素(),直到队尾大于等于新元素,再将新元素push,即保持队列中元素的递减(非严格)。这样可以将窗口内最大的元素保持在队首。pop时需要判断队首元素与窗口抛弃的元素是否相等,相等才pop,不相等说明在之前push阶段已经pop了。
2024-05-20 20:32:36
405
1
原创 代码随想录算法训练营第十一天|20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值
踩坑:要记得往栈里压的是左括号还是右括号思路:核心是最后出现的左括号一定是最先被消掉的。
2024-05-18 20:04:52
393
原创 代码随想录算法训练营第十天|232.用栈实现队列 225. 用队列实现栈
踩坑:对于STL中stack的成员函数还不熟悉,比如应该是empty不是is_empty,是top不是peek,pop没有返回值思路:两个栈相互捯饬,用一个栈来维持队列的形态,另一个用来将栈反转(栈顶变栈底)
2024-05-17 20:02:50
274
原创 代码随想录算法训练营第九天|28. 实现 strStr() 459.重复的子字符串
踩坑:由于对KMP不熟悉,导致每一个循环的条件,初始化都不是很明确思路:使用KMP算法,先求解next数组,在设计字串匹配逻辑。
2024-05-17 19:03:41
448
原创 代码随想录算法训练营第八天|344.反转字符串 541. 反转字符串II 卡码网:54.替换数字 151.翻转字符串里的单词 卡码网:55.右旋转字符串
踩坑:无坑可踩思路:和反转数组是一模一样的,相向双指针。
2024-05-15 21:06:59
383
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人