代码随想录二刷
文章平均质量分 58
weixin_42179093
这个作者很懒,什么都没留下…
展开
-
代码随想录算法训练营第23期day60|84.柱状图中最大的矩形
42接雨水 是找每个柱子左右两边第一个大于该柱子高度的柱子,而本题是找每个柱子左右两边第一个小于该柱子的柱子。本题是要找每个柱子左右两边第一个小于该柱子的柱子,所以从栈头(元素从栈头弹出)到栈底的顺序应该是从大到小的顺序。原创 2023-11-22 18:08:59 · 360 阅读 · 0 评论 -
代码随想录算法训练营第23期day59|503.下一个更大元素II、42. 接雨水
可以不扩充nums,在遍历的过程中模拟走两边nums。原创 2023-11-20 20:21:15 · 286 阅读 · 0 评论 -
代码随想录算法训练营第23期day57|739. 每日温度、496.下一个更大元素
1. 什么时候用单调栈?通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时就要想到可以用单调栈。单调栈的本质是空间换时间,更直白来说,就是用一个栈来记录我们遍历过的元素2. 单调栈里存放的元素是什么?单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。3. 单调栈里元素是递增呢?还是递减呢?顺序是指:栈顶到栈底的顺序。求一个元素右边第一个更大元素,单调栈就是递增求一个元素右边第一个更小元素,单调栈就是递减。原创 2023-11-20 20:19:24 · 215 阅读 · 0 评论 -
代码随想录算法训练营第23期day56|647. 回文子串、516.最长回文子序列
重点是构造了一个dp[i][j],来表示s字符串i到j是否是一个回文串。原创 2023-11-20 20:17:07 · 175 阅读 · 0 评论 -
代码随想录算法训练营第23期day55|583. 两个字符串的删除操作、72. 编辑距离
和查找子序列的操作类似,但是考虑的是删除操作。原创 2023-11-20 20:15:23 · 106 阅读 · 0 评论 -
代码随想录算法训练营第23期day54|392.判断子序列、115.不同的子序列
和最长公共子序列相似,不同之处在于这一道题只有母序列(较长的序列)可以进行删除操作,体现在遍历中就是除了左上方之外,上方和下方只有一个可以转移过来。原创 2023-11-20 20:13:19 · 170 阅读 · 0 评论 -
代码随想录算法训练营第23期day53|1143.最长公共子序列、1035.不相交的线、53. 最大子序和
【代码】代码随想录算法训练营第23期day53|1143.最长公共子序列、1035.不相交的线、53. 最大子序和。原创 2023-11-20 20:10:55 · 134 阅读 · 0 评论 -
代码随想录算法训练营第23期day52|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
子序列是可以在不改变原有次序的情况下删除一些元素,需要进行二重遍历进行判断。原创 2023-11-20 20:08:18 · 132 阅读 · 0 评论 -
代码随想录算法训练营第23期day50| 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
这里的每一个状态,例如状态一,是持有股票股票状态并不是说今天一定就买入股票,而是说保持买入股票的状态即:可能是前几天买入的,之后一直没操作,所以保持买入股票的状态。和股票问题二一样,区别在于卖出股票需要交手续费,所以最后的答案就不一定是dp[len-1][1](卖出),因为可能存在手续费高于收益的情况。原创 2023-11-13 11:29:02 · 80 阅读 · 0 评论 -
代码随想录算法训练营第23期day48|121. 买卖股票的最佳时机、122.买卖股票的最佳时机II
与第一题的唯一区别就在于转移方程中dp[i][0]的状态变化,也就是第i天持有股票的最大收益,因为第一题只能买一次,所以如果前一天不持有今天持有的话一定是-prices[i],但是这道题可以多次操作,所以前一天不持有今天持有的话应该是dp[i-1][1]-prices[i]。原创 2023-11-13 11:26:44 · 79 阅读 · 0 评论 -
代码随想录算法训练营第23期day49| 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV
增加了两次的限制,相应的就是需要考虑的状态改变。原创 2023-11-13 11:05:56 · 117 阅读 · 0 评论 -
代码随想录算法训练营第23期day47|198.打家劫舍、213.打家劫舍II、337.打家劫舍III
唯一区别就是成环了。分成三种状态:1. 不考虑头尾;其中情况2和3包括了第一种情况,因为DP算法会根据情况考虑要不要加入开头(结尾)。动态规划数组,当前节点偷和不偷的最大收益(dp[2]),二叉树遍历方法:后续遍历。原创 2023-11-13 10:40:08 · 71 阅读 · 0 评论 -
代码随想录算法训练营第23期day46|139.单词拆分
超时,查看背包思想后AC。原创 2023-11-13 10:37:30 · 75 阅读 · 0 评论 -
代码随想录算法训练营第23期day45|70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数
除了常规的可以爬一或二级台阶,当题目稍微修改一下,变成可以爬m级台阶,之前的DP思路就有局限(dp[i] = dp[i-1] + dp[i-2),为了通杀这类问题,可以将题目转换为完全背包问题,可以爬的楼梯级数就是背包中的物品,楼梯总数就是背包,注意例如五级台阶1,2,2和2,2,1是不同的方法,所以类比昨天的组合总数问题,需要先遍历背包,再遍历物品、注意转换为完全背包后的先物品再背包和先背包再物品的遍历方式在实现上的细节问题,这里将两种代码都放上。状态:查看思路Debug后AC。状态:查看思路后AC。原创 2023-11-13 10:32:24 · 58 阅读 · 0 评论 -
代码随想录算法训练营第23期day43|518. 零钱兑换II、377. 组合总和Ⅳ
完全背包问题和01背包在描述上的区别是:完全背包中的物品可以被无限使用;在代码上的区别是:遍历顺序中都是从小到大遍历,需要注意内外层的嵌套顺序要根据题目适时调整。原创 2023-11-04 17:28:31 · 167 阅读 · 0 评论 -
代码随想录算法训练营第23期day42|1049. 最后一块石头的重量II、494. 目标和、474.一和零
力扣题目链接状态:查看思路后AC。将石头重量分成两堆,这两堆的重量要尽可能相近。计算其中一堆的最大重量,因为sum/2向下取整,所以dp[target]肯定是重量较轻的那一堆,最后的答案就是重量较大的那一堆减去dp得到的这一堆,也就是(sum-dp[target]) - dp[target]。++i){--j){原创 2023-11-04 17:23:23 · 156 阅读 · 0 评论 -
代码随想录算法训练营第23期day41|01背包问题、01背包问题——滚动数组、416. 分割等和子集
在一维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。原创 2023-11-04 16:47:10 · 119 阅读 · 0 评论 -
代码随想录算法训练营第23期day40|343. 整数拆分、96.不同的二叉搜索树
那么从1遍历j,比较(i - j) * j和dp[i - j] * j 取最大的。从递归公式上来讲,dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] 中以j为头结点左子树节点数量为0,也需要dp[以j为头结点左子树节点数量] = 1, 否则乘法的结果就都变成0了。j的结束条件是 j < i - 1 ,其实 j < i 也是可以的,不过可以节省一步,例如让j = i - 1,的话,其实在 j = 1的时候,这一步就已经拆出来了,重复计算,所以 j < i - 1。原创 2023-11-04 16:44:25 · 86 阅读 · 0 评论 -
代码随想录算法训练营第23期day39 |62.不同路径、63. 不同路径 II
从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值。这里要看一下递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。原创 2023-11-04 16:42:36 · 144 阅读 · 0 评论 -
代码随想录算法训练营第23期day38|动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。原创 2023-11-04 16:39:05 · 277 阅读 · 0 评论 -
代码随想录算法训练营第23期day36|738.单调递增的数字、968.监控二叉树
所以应该是从叶子结点出发,将叶子节点的父节点装上摄像头,根据这个方向,可以使用左右中的递归顺序,这样可以在回溯的时候对中间节点进行逻辑判断,为此我们需要对每个节点的状态进行讨论,可以用3钟状态来描述:无覆盖0,有摄像头1,被覆盖2。需要注意的是空节点的状态应该是2。这个方法从局部出发,如果说想要从这个局部最优扩展到全局最优,需要使全局最优的答案可以复用局部最优,就只能从后往前判断而不是从前往后,和重叠区间有一点点逻辑上的类似,但是不好描述,用心体会。状态:查看思路后AC,可能会遗忘。原创 2023-10-29 18:00:09 · 246 阅读 · 0 评论 -
代码随想录算法训练营第23期day35|435. 无重叠区间、763.划分字母区间、56. 合并区间
同样是确定一个维度(排序),然后和射箭/无重叠区间类似。注意要在遍历结束后把最后一个插入进去。首先需要对各个字母的首次/最后出现时间进行统计,之后就是合并区间问题。和昨天的射箭问题一样,区别就是res的初始状态一个是1一个是0。状态:Debug后AC。状态:Debug后AC。原创 2023-10-29 17:56:48 · 128 阅读 · 0 评论 -
代码随想录算法训练营第23期day34 |860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球
本题要注意两点,首先是两个维度先确定哪一个,自己思考的想法是先确定前面的人数,也就是第二个,但是这样排序过后会发现在考虑身高时之前确定的维度被打乱,没有起到什么作用。首先,数组按照某一个维度进行排序的方法要掌握,其次,插入较多的算法,数据结构使用list效率比vector高,最后就是迭代器的使用。很符合直接的算法是记录5,10,20的面值个数(其实不记录20也可以),然后根据不同的面值进行讨论处理,这里需要注意的是,顾客给20有两种找零方式,如果有10块,可以10+5,如果没有10块,可以5*3。原创 2023-10-29 17:48:11 · 148 阅读 · 0 评论 -
代码随想录算法训练营第23期day33|1005.K次取反后最大化的数组和、134. 加油站、135.分发糖果
将数组按照绝对值大小从大到小排序,从前向后遍历如果遇到负数将其变为正数,k--,如果遍历完成之后k不为0,就反复转变绝对值最小的元素知道把次数用完,最后对数组求和即可。这道题的思路更像是按照题目的思路来进行而不是遵循一个固定的代码结构,具体说用了什么算法的话不好和贪心联想,这也表明了贪心问题的灵活性。注意从局部最优推导出全局最优可以判断为严格的贪心算法。状态:暴力AC,贪心没思路。状态:了解思路后AC。状态:查看思路后AC。原创 2023-10-29 17:40:30 · 57 阅读 · 0 评论 -
代码随想录算法训练营第23期day32|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II
状态:查看思路后AC。原创 2023-10-24 22:09:00 · 150 阅读 · 0 评论 -
代码随想录算法训练营第23期day31|贪心算法理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和
dp[i][0] = max(dp[i][0], dp[j][1] + 1),其中0 < j < i且nums[j] < nums[i],表示将 nums[i]接到前面某个山谷后面,作为山峰。dp[i][1] = max(dp[i][1], dp[j][0] + 1),其中0 < j < i且nums[j] > nums[i],表示将 nums[i]接到前面某个山峰后面,作为山谷。这个四步其实过于理论化了,我们平时在做贪心类的题目,做题的时候,只要想清楚局部最优是什么,如果推导出全局最优,其实就够了。原创 2023-10-24 22:04:27 · 461 阅读 · 0 评论 -
代码随想录算法训练营第23期day29|332.重新安排行程、51. N皇后、37. 解数独
状态:抄代码都看不明白。原创 2023-10-24 21:53:46 · 67 阅读 · 0 评论 -
代码随想录算法训练营第23期day28|491.递增子序列 46.全排列 47.全排列 II
这道题和之前全排列的区别就在于不是对同一层的重复元素进行去重,而是去除同一父节点下的重复使用元素,为了达到这个目的,需要使用哈希来判断是否重复,注意到数组中值的大小是-100到100之间,因此可以直接利用哈希数组进行判断。注意全排列和组合(子集)的最大区别在于,全排列的回溯展开每次都是从0开始而不是startIndex,因此需要一个used数组来对已经使用过的节点进行记录,值得注意的是在pop之后,used数组也要进行更新。这里的去重逻辑和组合中的树层去重逻辑类似,注意细节。状态:查看思路后也没AC。原创 2023-10-20 20:26:24 · 235 阅读 · 0 评论 -
代码随想录算法训练营第23期day27|93.复原IP地址、78.子集、90.子集II
状态:已AC,就是要注意收集子集,要放在终止添加的上面。判断是否合法,主要注意以下三点。状态:没有写出来,待回顾。先切割,再判断是否合法。原创 2023-10-20 20:21:58 · 83 阅读 · 0 评论 -
代码随想录算法训练营第23期day26|39. 组合总和、40.组合总和II、131.分割回文串
这道题的主要步骤可以拆分成两个部分,如何分割和如何判断。基本的回溯方法遵循回溯模板,需要注意的是回溯中的startIndex是从当前i继续而不是i+1,因为组合中的数字允许重复。在基本回溯的过程中,终止条件是当前层的sum大于target,但如果之后的数比当前数大,那么后续的递归是多余的。但是这道题还有另一个难点,那就是数组中会出现重复的元素,同一位置的元素不能重复使用,同时最终答案也不能出现重复path,这就是一个判断树层去重(而不是树枝去重)的过程,为此加入一个used数组作为辅助判断。原创 2023-10-20 19:42:37 · 173 阅读 · 0 评论 -
代码随想录算法训练营第23期day25| 216.组合总和III 、17.电话号码的字母组合
状态:查看思路后AC,没有想到如果出现输入1 * #按键等等异常情况怎么办。状态:已AC,就是在77题的前提下,多加了一个限制,需要和为定值。也可以放在调用递归之前,要记得要回溯操作给做了。剪枝的地方可以放在递归函数开始的地方。原创 2023-10-18 10:44:22 · 142 阅读 · 0 评论 -
代码随想录算法训练营第23期day24|回溯算法理论基础、77. 组合
1.回溯的本质是穷举,穷举所有可能,然后选出想要的答案(为了提升效率,最多再加一个剪枝)暴力算法不可取,毕竟如果k=50,就要循环50次。2.回溯法解决的问题都可以抽象为树形结构。因为回溯法解决的都是在集合中递归查找子集。原创 2023-10-16 22:14:17 · 145 阅读 · 0 评论 -
代码随想录算法训练营第23期day22|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
注意mid的写法,为了防止超出int界限,最好使用left + (right-left)/2的形式来写,这里的除2也可以写成右移一位的形式:left + (right-left>>1),注意移位运算符的优先级在加减之后。这道题的关键在于发现“换一个角度来看,这就是一个有序数组[2, 5, 13],求从后到前的累加数组,也就是[20, 18, 13]。至于如何将相关节点放到对应的位置,要下层节点返回,上层节点接收。状态:Debug后AC。状态:查看思路后AC。原创 2023-10-15 22:25:04 · 225 阅读 · 0 评论 -
代码随想录算法训练营第23期day21| 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
利用二叉搜索树的特性进行分析,不需要对中间节点进行操作,所以没办法区分前/中/后序遍历。状态:没有思路,还是236的套路。介绍一个二叉树的通用方法。状态:比上一题复杂得多。原创 2023-10-15 22:09:31 · 256 阅读 · 0 评论 -
代码随想录算法训练营第23期day20| 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
可以利用中序遍历方法来对重复元素进行检测,但是常规方法可能需要两次遍历,第一次统计出最大次数是多少,第二次找到出现这么多次数的元素。其中第二步的排序,在C++中如果使用std::map或者std::multimap可以对key排序,但不能对value排序。二叉搜素树中序遍历过程中,也可直接计算,需要用一个pre节点记录一下cur节点的前一个节点。后序遍历(左右中)就是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。把这个树都遍历,用map统计频率,把频率排个序,最后取前面高频的元素的集合。原创 2023-10-12 22:10:56 · 270 阅读 · 0 评论 -
代码随想录算法训练营第23期day19| 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
这道题可以通过中序遍历的顺序判断值是不是递增来判断,注意除了上面的那个思路问题,在实现时用于比较的值maxVal需要使用long long来初始化,以防测试用例中有INT_MIN。和昨天的中序+后/前序遍历序列构建二叉树思路类似,每次递归寻找数组中的最大值,根据最大值的索引来切分左右子序列进行递归生成,可以用索引下标来避免重复生成vector带来的开销。状态:思路错误,不能简单地比较根节点和左右子节点的大小。使用的方法可以AC但是不够简洁,留待后续改进。原创 2023-10-11 21:41:52 · 143 阅读 · 0 评论 -
代码随想录算法训练营第23期day18| 513.找树左下角的值、112. 路径总和、113.路径总和ii、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树
该题也用到了回溯法,但是值得注意的是回溯法不一定需要进行路径的记录。更进一步说的话,回溯法本身和路径记录没有关系,因为利用递归进行遍历本身就包含了回溯的过程,区别在于普通的遍历考虑的是当前节点和子节点的关系,而回溯则要求还要考虑和其父节点的关系。所以说,回溯法中,具体是怎么控制前进,抑或是怎么得到答案,全在于如何发现可以终止和进行回溯的条件是什么。通过后序遍历数组的最后一位来确定当前的根节点,接着确定根节点在中序遍历数组中的位置(索引),根据索引可以将中序遍历数组划分为左右两个子数组。原创 2023-10-11 21:35:24 · 43 阅读 · 0 评论 -
代码随想录算法训练营第23期day17| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和
高度是相对于叶子节点来说,大部分的递归都需要先走到叶子节点处再向上生长,这就有了高度的概念;而深度则是相对于根节点,在使用迭代方法计算二叉树高度的时候,程序从根节点往下走(层序),就有深度的感觉。可以继续利用回溯,回溯的关键就是要用一个数组来记录路径,然后每一次递归操作都要有一次路径的吐出操作(路径的增加在进入递归函数的时候会有)。对于本道题而言,需要注意的求的是左「叶子」节点,不是左孩子节点。注意:「回溯和递归是一一对应的,有一个递归,就要有一个回溯」。状态:了解思路后Debug AC。原创 2023-10-10 17:24:58 · 113 阅读 · 0 评论 -
代码随想录算法训练营第23期day15| 104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数
根节点的高度就是二叉树的最大深度,所以用后序遍历求的根节点高度来求的二叉树最大深度。虽然看上去和最大深度类似,但是需要加入对节点是否是叶子节点的判断(左右孩子为空)。迭代就是层序的时候每次出队列记录一下,递归和前面几题类似,也是后序遍历顺序。状态:递归AC,但是没有借助完全二叉树这一概念,所以还有改进的空间。状态:递归AC,迭代没来得及做,需要注意。状态:递归AC,迭代套模板AC。参照二叉树层序遍历的模板来解决。原创 2023-10-07 22:18:21 · 55 阅读 · 0 评论 -
代码随想录算法训练营第23期day14|二叉树层序遍历、226.翻转二叉树、101. 对称二叉树
状态:递归法、层序遍历AC,深度优先遍历还需回顾(原始代码就没有看的很清楚)传统的递归不行,注意最后还是遍历左孩子,因为中间节点翻转时已经将左右调转了。状态:递归法顺利AC,迭代法中使用栈的思路清楚并AC,使用队列的部分有点乱。把左右两个子树要比较的元素顺序放进一个容器,然后成对成对的取出来进行比较。借用队列实现,因为队列先进先出,符合层序遍历逻辑。前序、后序遍历都可以,中序不行。原创 2023-10-06 23:14:22 · 353 阅读 · 0 评论