![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法训练营
文章平均质量分 51
Samuel_88
这个作者很懒,什么都没留下…
展开
-
代码随想录算法训练营第六十天|84.柱状图中最大的矩形
要在直方图中找的最大的矩形, 那么必然是有至少一个柱子是被占满了的。例如 [2, 1, 5, 6, 2, 3 ], 第一个柱子被占满的最大面积是 2 * 1 = 2 (因为左边第一个比他小的下标在 -1, 右边第一个比他小的下标是1, 所以最大宽度是1, 最大高度是2), 第二个是 1 * 6 = 6, 第三个 5 * 2 =10, 第四个 6*1 = 6. 然后这个文件就被转化成了找到给个元素左边和右边第一个小于它的元素。如果没有, 左边的记为 -1, 右边的 len(heights) 方便处理。原创 2024-03-28 00:13:44 · 301 阅读 · 0 评论 -
代码随想录算法训练营第五十九天|503.下一个更大元素II 42. 接雨水
但是单调栈的思路就不一样了, 它的拆分方式时横向拆分, 当我们要推出一个元素时, 它右边的高度是将要推入的元素, 左边的高度是推出栈顶的元素的高度, 然后取最小值计算高度差, 宽度时推入元素 和 栈顶元素下标 的差值-1。以 [4, 2,0, 3, 2, 5] 为例, 前三个没有计算直接推入, st = [4, 2, 0] 当第三个元素被推入时, 首先被推出的0, 对的高度是 min(2, 3) - 0 =2, 宽度是1. 那先算这个小长方形面积。503.下一个更大元素II。503.下一个更大元素II。原创 2024-03-27 14:23:56 · 207 阅读 · 0 评论 -
代码随想录算法训练营第五十八天|739. 每日温度, 496.下一个更大元素 I
思路:本题是单调栈的一个经典应用, 单调栈是循环数组时, 不停的把元素推入栈中, 同时如果需要, 推出栈中的元素, 保持栈的单调性。单调栈可以是递增或者递减的。递增栈中, 栈顶的元素是最小的 (先入后出) 例如数组 [5, 3,4,1] 单调递增栈中的元素 i = 0, st = [5], i=1 st=[5, 3], i = 2 st = [5, 4] (推出3)。原创 2024-03-27 14:09:27 · 334 阅读 · 0 评论 -
代码随想录算法训练营第五十七天|647 回文子串 516.最长回文子序列
思路: 当我们看到两个下标 i, j 上 s[i]!= s[j], 那么 s[i: j+1] 一定不是回文子串。如果s[i] == s[j], 那么我们可以在检查 s[i+1: j] 是不是回文串。如果暴力搜索的话是 O(n^3) 的时间复杂度。我们可以用一个二维 dp 数组记录s[i: j+1] 是不是回文串。然后用 一个 visited 数组记录我们是不是已经经历过 i,j 的组合。原创 2024-03-25 14:33:03 · 399 阅读 · 0 评论 -
代码随想录算法训练营第五十五天| 583. 两个字符串的删除操作,72. 编辑距离
思路: 判断两个字符串最少经过多少步的删除操作可以相等。dp 数组记录的是w1[0:i] 和 w2[0:j] 的最少路径。初始化的时候记得dp的 0下标表示的是空字符串。所以 dp[0][j] = j, dp[i][0] = i.递推关系可以想到 如果w1[j-1] == w2[i-1], 那么最下路径就是 dp[i][j] = dp[i-1][j-1]. 麻烦点的是不相等的情况。原创 2024-03-24 21:10:54 · 168 阅读 · 0 评论 -
代码随想录算法训练营第五十四天|392.判断子序列, 115.不同的子序列
思路:第一种方法使用动态规划, 也就是寻找最长公共字符串, 如果最长公共字符串等于s的长度, 输出 True, 反之输出False。第二张方法使用双指针, 在外层循环字符串s, 然后内层开始找到s[0] 的位置。如果能找到, 例如位置是 j0, 然后开始从 t[j0:] 找 s[1], 位置是 j1, .... 如果没有找到的字符, 返回 False, 否则返回 True。难点: 无。原创 2024-03-24 20:55:53 · 274 阅读 · 0 评论 -
代码随想录算法训练营第五十三天|1143.最长公共子序列 1035.不相交的线 53. 最大子序和
思路: longest common subsequence 是动态规划中的经典问题。记住 如果 str1[i] == str2[j] dp[i+1][j+1]= dp[i][j] + 1, 不等的话 dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j]).难点: 无。原创 2024-03-21 12:55:23 · 193 阅读 · 0 评论 -
代码随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期 , 714.买卖股票的最佳时机含手续费
难点: 如果第一次碰到可能不太能想到用二维数组区分状态。思路: 和上一题一样, 只是递推关系稍微变了一点。原创 2024-03-18 23:23:48 · 312 阅读 · 0 评论 -
代码随想录算法训练营第50天|123.买卖股票的最佳时机III, 188.买卖股票的最佳时机IV
思路: 和之前一样, 数组表示股票价格, 要求最大收益, 但是复杂在了可以交易两次。我最初的思路是在 i 天先求0-i 天买卖一次的最大收益, 再求 i - 最后一天交易一次的最大收益。时间复杂度也是 O(n)。不过看了讲解的一般方法是填一个2维dp数组, 数组的 row 表示第 i 天, column 表示操作, 例如column 0 表示不操作, column 1 表示第一次持有, column2 表示第一次不持有。。。原创 2024-03-18 13:41:54 · 294 阅读 · 0 评论 -
代码随想录算法训练营第四十八天|121. 买卖股票的最佳时机 122.买卖股票的最佳时机II
思路: dp 数组记录的是持有到 第 i 天收益或者压根儿不买入到第i天的收益, dp[0] = 0. dp[i] = max(dp[i-1] + p[i] - p[i-1], 0). 注意最后不要返回dp[-1], 因为不是必须持有到最后一天的, 返回 max(dp). 当然更简单的做法是循环数组记录minium, max_profit = max(max_profit, nums[i]-minimum).难点: 无。原创 2024-03-16 17:29:42 · 234 阅读 · 0 评论 -
代码随想录算法训练营第四十七天|198.打家劫舍, 213.打家劫舍II , 337.打家劫舍III
今天练习三个打劫问题, 最后一个相对比较难想到的, 思路巧妙原创 2024-03-16 17:17:32 · 543 阅读 · 0 评论 -
代码随想录算法训练营第四十六天|139.单词拆分
dp[0] 要初始化成 1. 然后考虑到这个问题是排列问题, 例如 字符串‘leetcode’ 列表['code', 'leet']. 所以应该先循环背包容量再循环数组。如果 str[i-len(substr) :i] == substr, 并且 dp[i-len(substr)] 都是true 的时候, dp[i] = True. 或者 如果原本 dp[i] = True了, 就不要再往下循环数组了 (表示已经fit了)。难点:递归的逻辑比较难想, 要考虑原本dp[i] = True 的情况。原创 2024-03-16 16:53:24 · 245 阅读 · 0 评论 -
代码随想录算法训练营第四十五天|70. 爬楼梯 (进阶)322. 零钱兑换,279.完全平方数
练习三个完全背包问题, 求打包满的方法, 求打包满需要的最少元素。原创 2024-03-13 14:45:39 · 171 阅读 · 0 评论 -
代码随想录算法训练营第四十三天|1049. 最后一块石头的重量 II, 494. 目标和,474.一和零
今天继续01背包问题的练习, 这些问题其实都不是很直接的考察01背包, 需要一定的思路去转化问题。原创 2024-03-13 01:38:17 · 504 阅读 · 0 评论 -
代码随想录算法训练营第四十天|343. 整数拆分, 96.不同的二叉搜索树
动态规划, 更为复杂的递推关系原创 2024-03-09 17:49:41 · 200 阅读 · 0 评论 -
代码随想录算法训练营第三十九天|62.不同路径, 63. 不同路径 II
二维的动态规划问题, 机器人的路径原创 2024-03-09 17:30:30 · 233 阅读 · 0 评论 -
代码随想录算法训练营第三十七天| 738.单调递增的数字 , 968.监控二叉树 (跳过)
今天有最后两个贪心算法的训练题, 其中最后一个问题比较难, 这次就先跳过了。 另外有文档回顾贪心算法。原创 2024-03-06 16:14:46 · 140 阅读 · 0 评论 -
代码随想录算法训练营第三十六天|435. 无重叠区间, 763.划分字母区间, 56. 合并区间
今天继续练习greedy 算法, 练习了和区间的交集并集相关问题, 这种问题上了可以先考虑sorting 之后再处理。原创 2024-03-04 22:18:29 · 333 阅读 · 0 评论 -
代码随想录算法训练营第三十四天| 860.柠檬水找零, 406.根据身高重建队列 ,452. 用最少数量的箭引爆气球
今天继续练习贪心算法, 有个问题比较难的。原创 2024-03-04 17:16:06 · 323 阅读 · 0 评论 -
代码随想录算法训练营第三十三天|1005.K次取反后最大化的数组和 , 134. 加油站, 135. 分发糖果
思路: 这个问题比较简单, 其实就是每次都反转最小的数字就可以了, 可以通过对数组排序, 然后先从小到大反转一个负数,然后下标前移,如果当前下标不是负数了, 但还有反转次数, 就比较当前下标i 和 i-1 的数字那个更小, 哪个更小就反复反转哪一个。这里可以用个小技巧, 给数组append 一个正无穷的数字,避免数组全是负数的情况。还有更直接的方法使用优先队列。难点: 无。原创 2024-02-29 23:33:48 · 131 阅读 · 0 评论 -
代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II , 55. 跳跃游戏 , 45. 跳跃游戏 II
今天继续三个贪心算法的练习题。原创 2024-02-29 23:16:16 · 183 阅读 · 0 评论 -
代码随想录算法训练营第三十天|332.重新安排行程, 51. N皇后, 37. 解数独
今天继续练习backtrack算法, 今天的练习题有棋盘问题, 比较难的。原创 2024-02-27 17:20:48 · 290 阅读 · 0 评论 -
代码随想录算法训练营第二十九天|491.递增子序列 , 46.全排列 , 47.全排列 II
使用backtrace算法练习排列和子集问题原创 2024-02-27 02:14:55 · 243 阅读 · 0 评论 -
代码随想录第二十七天|93.复原IP地址 , 78.子集 , 90.子集II
今天继续练习回溯算法, 有一个分割问题和两个排序问题。原创 2024-02-25 16:51:33 · 137 阅读 · 0 评论 -
代码随想录算法训练营第二十六天|39. 组合总和 , 40.组合总和II , 131.分割回文串
backtracking 算法第三天,涉及的练习题包括组合和分割原创 2024-02-23 15:32:59 · 198 阅读 · 0 评论 -
代码随想录算法训练营第二十四天|回溯算法, 77 组合
思路: 找到一个从1-n的list中所有的 k 个元素的组合。容易想到, 如果k=1, 那么输出这个list 中的元素组成的二维list, 如果 k = n 返回 [input_list], 如果 k > n 返回空。如果k > 1 呢?那么可以先抽出 1, 然后在 2-n 中找出 k-1 的组合, 再把1 加进去, 然后抽出2, 然后在 3-n 中找出 k-1 的组合, 再把2加进去。难点: 退出迭代的条件。原创 2024-02-21 00:45:26 · 223 阅读 · 0 评论 -
代码随想录算法训练营第二十三天|669. 修剪二叉搜索树 , 108.将有序数组转换为二叉搜索树 , 538.把二叉搜索树转换为累加树
思路: 根据BST 的性质, 如果root的值大于high, 那么应该舍弃root 和root右边的 node, 并往下迭代修建root 左边的subtree。同理处理 root值小于low的情况。如果root 是空的,返回None。如果root 在[low, high] 这个区间, 那么root.left = 修剪后的 root.left, root.right = 修剪后的 root.right。难点: 无。原创 2024-02-20 01:59:21 · 197 阅读 · 0 评论 -
代码随想录算法训练营第二十二期|235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作, 450.删除二叉搜索树中的节点
思路: 本题比直接找二叉树的最近公共祖先更容易, 可以利用二叉树的性质。node 左边的值都小于node, node 右边的值都大于node。指针从 root 开始, 如果两个值都小于node, 指针往左移动, 反之往右移动。如果 node 的值恰好等于其中一个值,或者node值介于两个值中间, 输出该node。难点: 无。原创 2024-02-19 14:48:30 · 166 阅读 · 1 评论 -
代码随想录算法训练营第二十天|530.二叉搜索树的最小绝对差 , 501.二叉搜索树中的众数 , 236. 二叉树的最近公共祖先
思路:简单的想可以通过中序遍历BST,得到一个sorted array. 然后找到sorted array 中两个相邻元素的最小值。另外一个思路是当我们前序遍历到一个node 的时候, 我们知道比它的取值范围。例如 root = 2, root.left 在 [-inf, 2), root.right 在(2, inf) 之间, 可以遍历所有node, 找出node 值两个边界值最近的。还有一种方法是可以在BST中使用双指针法。通过中序遍历从 比较cur_node 和 pre_node 的差值。原创 2024-02-18 01:00:20 · 168 阅读 · 0 评论 -
代码随想录算法训练营第十九天|654.最大二叉树 ,617.合并二叉树 , 700.二叉搜索树中的搜索,98.验证二叉搜索树
思路: 这个问题比较直接, 按照题目的逻辑, 通过迭代法去构造就行了。难点: 无。原创 2024-02-16 11:13:21 · 182 阅读 · 1 评论 -
代码随想录算法训练营第十八天|513.找树左下角的值,112. 113 路径总和,106. 105 构造二叉树
思路:本题要找出二叉树最下面一层最左边的值, 一眼看过去就是用层序遍历。每一层的循环从左往右,开头的元素记录下来, 最后输出最后一层开头元素。难点: 无。原创 2024-02-15 13:50:35 · 360 阅读 · 1 评论 -
代码随想录算法训练营第十七天|110.平衡二叉树, 257. 二叉树的所有路径, 404.左叶子之和 (优先掌握递归)
思路:本题要求判断一棵树是否是平衡二叉树, 平衡二叉树的定义是对于所有node左subtree 的高度 - 右subtree 高度的绝对值不能大于1. 求一个node 的高度可以用递归法, 1 + max(height(node.left), height(node.right))。这里因为需要对所有的node判断, 要求所有node 的高度, 包含了大量的重复遍历, 因此我这里通过一次遍历, 把node 的高度赋值给node的 val. 这样可以简化复杂度。原创 2024-02-14 11:39:06 · 323 阅读 · 1 评论 -
代码随想录算法训练营第十六天|104.二叉树的最大深度,111.二叉树的最小深度, 222.完全二叉树的节点个数
今天继续练习二叉树。原创 2024-02-08 12:53:45 · 115 阅读 · 0 评论 -
代码随想录算法训练营第十五天|层序遍历 , 226.翻转二叉树, 101.对称二叉树
思路: 直接用递归就行了。原创 2024-02-07 17:00:40 · 215 阅读 · 1 评论 -
代码随想录算法训练营第十四天|二叉树基础, 144.二叉树的前序遍历, 94.二叉树的中序遍历, 145.二叉树的后序遍历
递归遍历 (必须掌握)题目链接/文章讲解/视频讲解:代码随想录代码随想录PDF,代码随想录百度网盘,代码随想录知识星球,代码随想录八股文PDF,代码随想录刷题路线,代码随想录知识星球八股文迭代遍历题目链接/文章讲解/视频讲解:代码随想录代码随想录PDF,代码随想录百度网盘,代码随想录知识星球,代码随想录八股文PDF,代码随想录刷题路线,代码随想录知识星球八股文统一迭代题目链接/文章讲解:代码随想录。原创 2024-02-06 12:38:43 · 131 阅读 · 1 评论 -
代码随想录算法训练营第十三天|239. 滑动窗口最大值, 347.前 K 个高频元素
今天主要进行队列的应用训练。原创 2024-02-05 15:20:09 · 317 阅读 · 1 评论 -
代码随想录算法训练营第11天|20. 有效的括号,1047. 删除字符串中的所有相邻重复项 , 150. 逆波兰表达式求值
今天主要是对昨天学习的栈的知识做应用。栈主要是应用在一些需要考虑后入先出的问题中的, 其中有一些例题我之前已经做过, 但是当时没有栈的概念, 而是使用了指针的方法 in-place 的删减 列表或者 string 的元素来模拟栈。原创 2024-02-04 16:00:31 · 466 阅读 · 1 评论 -
代码随想录算法训练营第十天|232.用栈实现队列, 225. 用队列实现栈
今天学习了栈和队列两种基本的数据结构, 之前对这两种结构的理解只是在应用层面。队列是 First-in-first-out。栈是 Last-in-first-out.队列或者栈的底层都可以通过 deque (双向队列)来实现。栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。所以STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。原创 2024-02-02 17:53:09 · 191 阅读 · 1 评论 -
代码随想录算法训练营第九天|28. 实现 strStr(), 459.重复的子字符串
通过今天的学习, 了解使用 KMP算法做字符串匹配, 字符串的 next 数组定义以及实现算法。收获颇丰。原创 2024-02-01 18:59:33 · 316 阅读 · 1 评论 -
代码随想录算法训练营第八天|344.反转字符串 , 541. 反转字符串II,卡码网:54.替换数字 ,151.翻转字符串里的单词 ,卡码网:55.右旋转字符串
今天开始练习string,python 中 string类有很多好用的成员函数,是的练习比较简单。原创 2024-01-31 17:58:38 · 306 阅读 · 0 评论