![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
代码随想录算法训练营
文章平均质量分 58
七人酒
这个作者很懒,什么都没留下…
展开
-
代码随想录总结
目前个人刷题能力还只在二叉树这里,对了哈希表也是不太行。还是需要认真学习。对于贪心这方面,在卡哥这里只能说醍醐灌顶,思路清晰,希望之后可以再深入学习。动态规划可以说最折磨了,希望自己之后可以多深入学习吧。对了也准备学一学图论。原创 2023-09-24 19:04:50 · 100 阅读 · 0 评论 -
代码随想录 -- day60 -- 84.柱状图中最大的矩形
【代码】代码随想录 -- day60 -- 84.柱状图中最大的矩形。原创 2023-09-24 19:01:55 · 108 阅读 · 0 评论 -
代码随想录 -- day59 -- 503.下一个更大元素II 、42. 接雨水
【代码】代码随想录 -- day59 -- 503.下一个更大元素II 、42. 接雨水。原创 2023-09-24 19:00:45 · 103 阅读 · 0 评论 -
代码随想录 -- day58 -- 739. 每日温度 、496.下一个更大元素 I
【代码】代码随想录 -- day58 -- 739. 每日温度 、496.下一个更大元素 I。原创 2023-09-24 18:58:54 · 85 阅读 · 0 评论 -
代码随想录 -- day23 -- ● 669. 修剪二叉搜索树 、108.将有序数组转换为二叉搜索树 、538.把二叉搜索树转换为累加树
【代码】代码随想录 -- day23 -- ● 669. 修剪二叉搜索树 、108.将有序数组转换为二叉搜索树 、538.把二叉搜索树转换为累加树。原创 2023-09-20 20:02:52 · 207 阅读 · 0 评论 -
代码随想录 -- day57 -- 647. 回文子串 、516.最长回文子序列
【代码】代码随想录 -- day57 -- 647. 回文子串 、516.最长回文子序列。原创 2023-09-20 20:00:31 · 110 阅读 · 0 评论 -
代码随想录 -- day56 -- 583. 两个字符串的删除操作 、72. 编辑距离
【代码】代码随想录 -- day56 -- 583. 两个字符串的删除操作 、72. 编辑距离。原创 2023-09-20 19:58:13 · 113 阅读 · 0 评论 -
代码随想录 -- day55 --392.判断子序列 、115.不同的子序列
t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];原创 2023-09-20 19:54:15 · 176 阅读 · 0 评论 -
代码随想录 --- day22 -- 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、 450.删除二叉搜索树中的节点
【代码】代码随想录 --- day22 -- 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、 450.删除二叉搜索树中的节点。原创 2023-09-17 13:09:24 · 257 阅读 · 0 评论 -
代码随想录 --- day21 --- 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先
频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集(以下代码为result数组),因为结果集之前的元素都失效了。判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了。而且初始化的时候pre = NULL,这样当pre为NULL时候,我们就知道这是比较的第一个元素。原创 2023-09-17 13:05:35 · 307 阅读 · 0 评论 -
代码随想录 -- day53 -- 1143.最长公共子序列 、1035.不相交的线、53. 最大子序和
如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]根据dp[i]的定义,很明显dp[0]应为nums[0]即dp[0] = nums[0]。原创 2023-09-17 12:59:45 · 69 阅读 · 0 评论 -
代码随想录 -- day52 --300.最长递增子序列 、674. 最长连续递增序列 、718. 最长重复子数组
如果 nums[i] > nums[i - 1],那么以 i 为结尾的连续递增的子序列长度 一定等于 以i - 1为结尾的连续递增的子序列长度 + 1。dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。即当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;根据dp[i][j]的定义,dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。原创 2023-09-17 12:47:02 · 86 阅读 · 0 评论 -
代码随想录 -- day51 --309.最佳买卖股票时机含冷冻期 、714.买卖股票的最佳时机含手续费
那么dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);所以:dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);所以:dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);即:dp[i][2] = dp[i - 1][0] + prices[i];昨天卖出了股票(状态三)原创 2023-09-17 12:39:02 · 124 阅读 · 0 评论 -
代码随想录 -- day50 -- 123.买卖股票的最佳时机III 、188.买卖股票的最佳时机IV
选最大的,所以 dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1]);dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])使用二维数组 dp[i][j] :第i天的状态为j,所剩下的最大现金是dp[i][j]k次的交易 所以有2 * k次的情况,k次买入,k次卖出。原创 2023-09-13 18:44:04 · 87 阅读 · 0 评论 -
代码随想录 -- day49 -- 121. 买卖股票的最佳时机 、122.买卖股票的最佳时机II
dp[i][0] 表示第i天持有股票所得最多现金,dp[i][0] 表示第i天持有股票所得最多现金。dp[i][0] 表示第i天持有股票所得最多现金,dp[i][0] 表示第i天持有股票所得最多现金。和上面的不同在于可以多次买入卖出。原创 2023-09-12 10:54:14 · 101 阅读 · 0 评论 -
代码随想录 -- day48 -- 198.打家劫舍、213.打家劫舍II 、337.打家劫舍III
【代码】代码随想录 -- day48 -- 198.打家劫舍、213.打家劫舍II 、337.打家劫舍III。原创 2023-09-11 21:10:17 · 94 阅读 · 0 评论 -
代码随想录 -- day46 --139.单词拆分
递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。本题一定是 先遍历 背包,再遍历物品。原创 2023-09-09 20:39:24 · 106 阅读 · 0 评论 -
代码随想录 -- day45 -- 70. 爬楼梯 (进阶)、322. 零钱兑换 、279.完全平方数
递推公式:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);递推公式:dp[j] = min(dp[j - i * i] + 1, dp[j]);这里要注意,这是一个排列组合的问题,所以要先遍历背包再遍历物品。递推公式为:dp[i] += dp[i - j]原创 2023-09-09 20:37:03 · 117 阅读 · 0 评论 -
代码随想录 -- day44 -- 完全背包、518. 零钱兑换 II 、377. 组合总和 Ⅳ
完全背包的物品是可以添加多次的,所以要从小到大去遍历。原创 2023-09-08 15:15:04 · 48 阅读 · 0 评论 -
代码随想录 -- day43 -- 1049. 最后一块石头的重量 II 、494. 目标和、474.一和零
本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。public:i++) { // 遍历物品j--) { // 遍历背包。原创 2023-09-08 14:50:23 · 47 阅读 · 0 评论 -
代码随想录 -- day42 -- 01背包问题、416. 分割等和子集
有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历!因为题目中nums[i]是大于等于1 的 所以dp[0]是不会有结果的,所以dp[0] = 0。dp[j] 是容量为j的背包,所背的最大价值。,求解将哪些物品装入背包里物品价值总和最大。我们要求的是让两边子集相等。1、确定dp数组及下标含义。3、dp数组如何初始化。原创 2023-09-08 10:28:11 · 110 阅读 · 0 评论 -
代码随想录 -- day41 -- 343. 整数拆分 、96.不同的二叉搜索树
dp[i]:表示拆分数字i,所得到的最大的乘积。原创 2023-09-04 19:31:51 · 34 阅读 · 0 评论 -
代码随想录 -- day39 -- 62.不同路径 、63. 不同路径 II
这里要看一下递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。首先dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。只能从dp[i - 1][j] 和 dp[i][j - 1]这两个方向来算。所以我们就要加限制条件。原创 2023-09-02 20:23:44 · 62 阅读 · 0 评论 -
代码随想录 -- day37 -- 738.单调递增的数字 、968.监控二叉树 (过)
例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。原创 2023-09-02 20:17:05 · 218 阅读 · 0 评论 -
代码随想录 -- day38 -- 509. 斐波那契数、70. 爬楼梯 、746. 使用最小花费爬楼梯
动态规划五部曲:dp[i]保存的是第i个数的对应结果题目已经告诉了 dp[i] = dp[i - 1] + dp[i - 2]dp[0] = 0, dp[1] = 1;从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],我们来推导一下,当N为10的时候,dp数组应该是如下的数列:0 1 1 2 3 5 8 1原创 2023-09-01 21:22:52 · 167 阅读 · 0 评论 -
代码随想录 -- day36 -- 435. 无重叠区间 、763.划分字母区间 、 56. 合并区间
然后把排序完的第一个放入保存的结果的地方,int end = result.back()[1],这是第一个的右边界,然后开始遍历interval,从坐标为1的开始,如果他的左边界小于end,就要合并,让右边界为max(result.back()[1], intervals[i][1])。,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,如果这个最小值也触达到区间3,那么说明 区间 1,2,3都是重合的。按照 [ [1,2], [2,3], [3,4], [1,3] ]假如我们按照右边界排序。原创 2023-09-01 21:13:31 · 336 阅读 · 0 评论 -
代码随想录 -- day35 -- 860.柠檬水找零 、406.根据身高重建队列 、452. 用最少数量的箭引爆气球
排序完的people: [[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]]原创 2023-08-31 09:35:05 · 450 阅读 · 0 评论 -
代码随想录 -- day34 -- 1005.K次取反后最大化的数组和、134. 加油站 、135. 分发糖果
如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)如果ratings[i] > ratings[i - 1] 那么[i]的糖 一定要比[i - 1]的糖多一个,所以贪心:candyVec[i] = candyVec[i - 1] + 1。局部最优可以推出全局最优。原创 2023-08-26 11:21:45 · 559 阅读 · 0 评论 -
代码随想录 -- day32 -- 122.买卖股票的最佳时机II 、55. 跳跃游戏、 45.跳跃游戏II
i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。而 cover 每次只取 max(该元素数值补充后的范围, cover 本身范围)。如果 cover 大于等于了终点下标,直接 return true 就可以了。原创 2023-08-26 11:11:24 · 779 阅读 · 0 评论 -
代码随想录 -- day31 -- 455.分发饼干 、376. 摆动序列 、53. 最大子序和
针对以上情形,result 初始为 1(默认最右面有一个峰值),此时 curDiff > 0 && preDiff原创 2023-08-25 14:38:24 · 818 阅读 · 0 评论 -
代码随想录 -- day30 -- 332.重新安排行程 、51. N皇后、37. 解数独
一个机场映射多个机场,机场之间要靠字母序排列,一个机场映射多个机场,可以使用std::unordered_map,如果让多个机场之间再有顺序的话,就是用std::map 或者std::multimap 或者 std::multiset。拿题目中的示例为例,输入: [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]] ,这是有4个航班,那么只要找出一种行程,行程里的机场个数是5就可以了。1、确定递归函数和参数。2、135度没有棋子。原创 2023-08-24 20:55:25 · 920 阅读 · 0 评论 -
代码随想录 -- day29 -- 491.递增子序列、46.全排列、47.全排列 II
全排列就不用startIndex,直接从0开始。原创 2023-08-23 21:26:36 · 952 阅读 · 0 评论 -
代码随想录 -- day28 -- 93.复原IP地址 、78.子集 、90.子集II
我们在[startIndex, i]中截取来判断是否满足是IP地址,满足的话就在i + 1地方加一个".",记住继续递归的时候是从i + 2这个位置开始。因为被分成四段,所以pointNum为3个的时候是满足的,然后在判断是否可以作为IP,可以的话就加入result。其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。就是startIndex已经大于数组的长度了,就终止了,因为没有元素可取了。这个和之前的去重思路一样,树层上去重。剩余集合为空的时候,就是叶子节点。原创 2023-08-23 21:18:37 · 947 阅读 · 0 评论 -
代码随想录 -- day27 -- 39. 组合总和、40.组合总和II、131.分割回文串
此外我还定义了int型的sum变量来统计单一结果path里的总和,其实这个sum也可以不用,用target做相应的减法就可以了,最后如何target==0就说明找到符合的结果了,但为了代码逻辑清晰,我依然用了sum。这里依然是定义两个全局变量,二维数组result存放结果集,数组path存放符合条件的结果。可以使用双指针法,一个指针从前向后,一个指针从后向前,如果前后指针所指向的元素是相等的,就是回文字符串了。重复元素有两个类型:树枝上重复和树层上重复。回文子串是正着读和反着读都一样的字符串。原创 2023-08-22 18:47:11 · 1146 阅读 · 0 评论 -
代码随想录 -- day25 -- 216.组合总和III、17.电话号码的字母组合
终止条件就是如果index 等于 输入的数字个数(digits.size)了(本来index就是用来遍历digits的)。这个index是记录遍历第几个数字了,就是用来遍历digits的(题目中给出数字字符串),同时index也表示树的深度。这里要先把Index指向的数字取出来,然后把对应的字符集取出。这个和之前的组合的题目的区别就是质包含 1 - 9。就是for循环里 不能超过9,其他的都差不多。原创 2023-08-22 18:25:09 · 1114 阅读 · 0 评论 -
代码随想录 -- day24 -- 理论基础 、77. 组合
然后还需要一个参数,为int型变量startIndex,这个参数用来记录本层递归的中,集合从哪里开始遍历(集合就是[1,...,n] )。再来看一下参数,因为回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。在上面我们提到了,回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。原创 2023-08-22 18:18:44 · 903 阅读 · 0 评论 -
代码随想录 --- day20 -- 654.最大二叉树 、617.合并二叉树 、 700.二叉搜索树中的搜索 、98.验证二叉搜索树
首先我们先遍历这棵树,找到数值最大的值作为头节点的val,然后记录这个数值的坐标,左边的值就是左子树,右边就是右子树,然后继续递归,把左右节点一个找出来。思路:其实这个很简单,就是先判断两个节点是否为空,如果有一个是就返回另一个,然后开始遍历,我们让Tree2的val加到Tree1上。,我们可以用中序遍历,把树的元素存在vector里,然后遍历,看看是不是前一个节点小于后一个。这就决定了,二叉搜索树,递归遍历和迭代遍历和普通二叉树都不一样。原创 2023-08-21 09:35:35 · 1221 阅读 · 0 评论 -
代码随想录 -- day18 -- 513.找树左下角的值、112. 路径总和 113.路径总和ii、106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
可以使用前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左优先就行),保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。难点就是切割数组,我们可以先确定根节点,然后把中序数组的根节点的坐标确定,然后分成中序左数组和右数组。再分割后序数组,后序数组分成左右数组,怎么分呢,就是左数组和中序左数组大小一样,右数组也是。第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)第五步:切割后序数组,切成后序左数组和后序右数组。原创 2023-08-12 20:13:49 · 1520 阅读 · 0 评论 -
代码随想录 -- day17 -- 110.平衡二叉树 、257. 二叉树的所有路径 、404.左叶子之和
中我们可以使用层序遍历来求深度,但是就不能直接用层序遍历来求高度了,这就体现出求高度和求深度的不同。这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。这个函数通过栈模拟的后序遍历找每一个节点的高度(其实是通过求传入节点为根节点的最大深度来求的高度)在这道题目中将第一次涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一个路径再进入另一个路径。本题的迭代方式可以先定义一个函数,专门用来求高度。原创 2023-08-12 20:03:18 · 1540 阅读 · 0 评论 -
代码随想录 -- day16 104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数
就是遍历这个完全二叉树,只要有节点就让number++。什么是叶子节点,左右孩子都为空的节点才是叶子节点!我是比较喜欢用层序遍历。原创 2023-08-10 10:57:45 · 1696 阅读 · 1 评论