代码随想录算法训练营
wizard_fire
这个作者很懒,什么都没留下…
展开
-
Day.42 | 42.接雨水 84.柱状图中最大的矩形
要点:右边第一个更大的元素,与当前元素,与当前元素的左边栈顶元素,构成一个凹槽,计算凹槽的面积,获得结果。计算结果的时候,当前元素会被pop掉,所以其实是一行一行的计算能接雨水的量。原创 2024-08-15 08:18:46 · 227 阅读 · 0 评论 -
Day.41 | 739.每日温度 496.下一个更大元素I 503.下一个更大元素II
要点:求当前元素的下一个更大元素,并在结果数组中,当前元素的索引位置,放入与更大元素索引的差值,单调栈的经典题目,要模拟栈中数据弹出和入栈的过程。原创 2024-08-13 21:13:23 · 288 阅读 · 0 评论 -
Day.40 | 647.回文子串 516.最长回文子序列
【代码】Day.40 | 647.回文子串 516.最长回文子序列。原创 2024-08-12 22:15:13 · 214 阅读 · 0 评论 -
Day.39 | 115.不同的子序列 583.两个字符串的删除操作 72.编辑距离
要点:当 s[i - 1] == t[j - 1] 的时候,即 "bagg" 和 "bag" 中,"bag" 和 "ba" 的匹配个数和 "bag" 和 "bag" 的匹配个数相加;当 s[i - 1]!= t[j - 1] 的时候,就是直接取上一位的匹配结果,"bag" 和 "ba",与 "ba" 和 "ba" 的匹配结果是一样的。原创 2024-08-11 00:02:30 · 270 阅读 · 0 评论 -
Day.38 | 1143.最长公共子序列 1035.不相交的线 53.最大子序和 392.判断子序列
要点:dp[i][j] = dp[i - 1][j - 1] + 1;原创 2024-08-08 22:57:07 · 216 阅读 · 0 评论 -
Day.37 | 300.最长递增子序列 674.最长连续递增序列 718.最长重复子数组
要点:dp[i] 表示在位置 i 处,最长递增子序列的长度。原创 2024-08-07 22:57:42 · 175 阅读 · 0 评论 -
Day.36 | 188.买卖股票的最佳时机IV 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费
要点:股票卖麻了。其实就是结合上一个仅能买卖两次的股票题找规律,把递推公式转变成for循环解决问题。原创 2024-08-06 21:22:34 · 174 阅读 · 0 评论 -
Day.35 | 121.买卖股票的最佳时机 122.买卖股票的最佳时机II 123.买卖股票的最佳时机III
要点:dp[i][0] 是第 i 天持有股票时的资产,dp[i][1] 是第 i 天卖出股票时的资产,只跟前一天有关。原创 2024-08-01 20:36:23 · 224 阅读 · 0 评论 -
Day.34 | 198.打家劫舍 213.打家劫舍II 337.打家劫舍III
要点:1. 房子形状为数组,dp[i] 偷到第 i 间房子,最多可以偷多少;2. 递推公式,由前两间房子被偷的状态推导出来;3. 初始化,i 与 i-1 i-2 有关,所以初始化 0 1;4. 顺序,i 与 i-1 i-2 有关,所以正序。原创 2024-07-31 21:47:35 · 182 阅读 · 0 评论 -
Day.33 | 322.零钱兑换 279.完全平方数 139.单词拆分
要点:dp数组 dp[j] 的含义是装 j 金额的背包,最少需要的硬币数。原创 2024-07-30 21:12:12 · 201 阅读 · 0 评论 -
Day.32 | 518.零钱兑换 II 377.组合总和 Ⅳ
要点:先遍历数组,后遍历背包,求的是组合数。原创 2024-07-29 21:37:05 · 169 阅读 · 0 评论 -
Day.31 | 1049.最后一块石头的重量II 494.目标和 474.一和零
要点:思路与分割等和子集很类似,把总数分成和最接近的两堆,然后用01背包的套路解答。原创 2024-07-28 23:09:07 · 244 阅读 · 0 评论 -
Day.30 | 416.分割等和子集
要点:把题意理解成容量为sum/2的背包问题,就可以套公式解决。原创 2024-07-27 21:29:22 · 147 阅读 · 0 评论 -
Day.29 | 62.不同路径 63.不同路径 II
要点:二维dp数组,初始化第一行第一列都是1,因为只有一种方法可以走到第一行或第一列;除第一行第一列外,其他格子能走到的路径数为其左边格子和上方格子之和;想到这两点,这题就可以解答。原创 2024-07-26 21:55:58 · 161 阅读 · 0 评论 -
Day.28 | 509.斐波那契数 70.爬楼梯 746.使用最小花费爬楼梯
要点:五部曲公式动规第一题;1.dp数组的意义&数组下标的意义;2.确定递推公式;3.数组初始化;4.确定遍历顺序;5.举例推导dp数组。原创 2024-07-25 19:12:52 · 270 阅读 · 0 评论 -
Day.26 | 452.用最少数量的箭引爆气球 435.无重叠区间 763.划分字母区间
要点:找重叠区间。如果当前元素的左边界大于前一元素的右边界,说明两元素没有重叠,需要一只箭;如果有重叠,则继续看后一元素,后一元素的左边界大于当前元素和前一元素最小的右边界,说明后一元素跟前两个元素没有重叠,需要一只箭引爆前两个元素。原创 2024-07-23 22:59:59 · 195 阅读 · 0 评论 -
Day.25 | 134.加油站 135.分发糖果 860.柠檬水找零 406.根据身高重建队列
要点:局部最优推全局最优。rest = gas - cost,当天的总rest,是前面每一天rest的累加,如果当天总rest小于0,说明从起点到当天的这个区间内,无论从哪一天开始,都是开不到终点的,只有当天的下一天才有可能到终点。totalSum用于判断是不是真的能到终点。原创 2024-07-22 22:25:44 · 195 阅读 · 0 评论 -
Day.24 | 122.买卖股票的最佳时机II 55.跳跃游戏 45.跳跃游戏II 1005.K次取反后最大化的数组和
要点:利润和,其实就是每天的利润加起来,要使利润和最大,只需要记录利润为正的时候就行。也就是相邻元素的差为正,就记为正。原创 2024-07-20 22:12:17 · 189 阅读 · 0 评论 -
Day.23 | 455.分发饼干 376.摆动序列 53.最大子序和
要点:大饼干分给和大饼干最匹配的最大胃口的孩子。所以要定住饼干的索引,挨个问孩子,能不能刚好满足胃口,碰到合适的孩子,就分给他,然后饼干索引移动一位。原创 2024-07-20 20:33:04 · 167 阅读 · 0 评论 -
Day.22 | 491.递增子序列 46.全排列 47.全排列 II
要点:在不排序的前提下,如何去重。原创 2024-07-19 20:38:04 · 170 阅读 · 0 评论 -
Day.21 | 93.复原IP地址 78.子集 90.子集II
要点:判断截取出来的ip数字是否合法;因为要截4个数字出来,所以以加入的 ‘ . ’ 为递归终止条件,有三个点递归就结束。原创 2024-07-19 19:44:44 · 152 阅读 · 0 评论 -
Day.20 | 39.组合总和 40.组合总和II 131.分割回文串
要点:元素可以重复,那么遍历的startIndex就跟之前的回溯算法不一样了;原创 2024-07-16 21:35:30 · 158 阅读 · 0 评论 -
Day.19 | 77.组合 216.组合总和III 17.电话号码的字母组合
要点:回溯算法的经典题目,把代码套路当公式一样背下来吧。原创 2024-07-16 20:45:45 · 166 阅读 · 0 评论 -
Day.18 | 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
要点:递归中还有递归。为什么要再套一层递归,在删除节点后,例如删除比下界小的节点,该节点的左子树肯定全部比下界小,左子树可以全部删除,但是右子树里可能还存在比下界小的节点,所以需要加一层递归去删除。(其实还是有点没梳理清楚)原创 2024-07-15 13:57:56 · 173 阅读 · 0 评论 -
Day.17 | 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
要点:当节点遍历到p和q中间的时候,就是最近公共祖先。所以当p q都比当前遍历节点小,向左遍历,反之向右遍历,在中间,就是想要的结果。因为二叉搜索树有序的特性,此题相当于找公共祖先的特解。原创 2024-07-14 22:19:32 · 233 阅读 · 0 评论 -
Day.16 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
要点:把二叉搜索树变成有序数组,因为数组有序,求最小绝对差,只需要求有序数组相邻元素差的最小值就可以了。只要能想出这个思路,这道题就能秒。二叉搜索树的中序遍历结果就是一个有序数组。原创 2024-07-14 16:31:15 · 134 阅读 · 0 评论 -
Day.15 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
要点:递归,递归到最底层,传进去的nums序列中元素个数为0,递归终止,终止的上一层,必然只有一个节点,这个节点在其上一层节点的左边还是右边,就是左节点或者右节点。其实递归每一层就是确定一个元素,再确定这个元素是左节点还是右节点。原创 2024-07-13 22:42:26 · 199 阅读 · 0 评论 -
Day.14 | 513.找树左下角的值 112.路径总和 前中后序构造二叉树
要点:理解题意,找左下角的值,就是找最大深度最左边节点的值,显然第一时间就能想到层序遍历,用递归法加深一下对回溯的理解。原创 2024-07-13 13:17:28 · 112 阅读 · 0 评论 -
Day.13 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数
要点:递归三部曲:1.确定递归函数的参数和返回值 2.确定终止条件 3.确定单次递归的处理逻辑。这一题,单次递归处理就是判断左右子树高度的差值是否小于1。也是一道递归后序遍历求高度的题目。原创 2024-07-09 23:05:54 · 198 阅读 · 0 评论 -
Day.12 | 226.翻转二叉树 101.对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度
要点:只要能理解到,翻转二叉树,其实就是把二叉树中的所有节点的左右孩子交换,这道题就很简单了。所有对二叉树的遍历方法,即只要能访问二叉树所有节点,访问的同时交换其左右孩子,这样的方法都适用于这道题目。原创 2024-07-08 19:37:57 · 110 阅读 · 0 评论 -
Day.11 | 二叉树 递归遍历 迭代遍历 统一迭代 层序遍历
要点:确定递归的终止条件和需要传入的参数。原创 2024-07-04 20:49:50 · 161 阅读 · 0 评论 -
Day.10 | 150.逆波兰表达式求值 239.滑动窗口最大值 347.前 K 个高频元素
要点:确实是没做过的话很难想到解题思路,理解逆波兰表达式是什么,计算机是如何计算数学表达式的方法:1. 遍历,找+-*/ 四个符号2. 碰到符号,就把栈顶的两个元素弹出计算结果3. 将计算出的结果push入栈。原创 2024-07-03 19:06:14 · 258 阅读 · 0 评论 -
Day.9 | 232.用栈实现队列 225.用队列实现栈 20.有效的括号 1047.删除字符串中的所有相邻重复项
要点:用栈实现队列,队列是先进先出,要实现取队列头部的元素,就要把栈中的元素一个个拿出来,直到取出第一个,再把取出的元素一个个放回去,所以很容易就可以想到,需要额外的数据结构来保存取出的元素方法:1. 两个数据结构,一个出栈,一个入栈2. 要实现取队列顶端的元素,push的时候,往入栈里push,pop的时候,先从出栈里弹,如果出栈为空,就按照先进后出的原则,把入栈的元素一个个放进出栈,再从出栈里弹。原创 2024-07-02 17:32:07 · 155 阅读 · 0 评论 -
Day.8 | 151.翻转字符串里的单词 55.右旋转字符串
要点:双指针移除多余的空格,想了很久才想明白方法:1. 移除多余空格1.1 碰到字母,快慢指针一起走1.2 快指针碰到空格,先走,不管慢指针,直到碰到字母再停下1.3 快指针碰到字母停下后,慢指针加入一个空格,前移一位1.4 第一个单词做一下特殊处理2. 去除多余空格后,整个字符串先反转3. 遍历字符串,碰到空格或者直到字符串末尾,将单词原地反转。原创 2024-07-02 16:15:30 · 232 阅读 · 0 评论 -
Day.7 | 344.反转字符串 541.反转字符串II 54.替换数字
要点:太简单了,没什么特别的要注意的地方方法:1. 双指针,一个从前开始,一个从后开始,往中间移动直到相遇2. 同时开始,同时交换,同时移动,同时结束。原创 2024-06-28 20:47:43 · 178 阅读 · 0 评论 -
Day.6 | 454.四数相加II 383.赎金信 15.三数之和 18.四数之和
要点:在4个数组中分别取一个数,让4个数相加为0,感觉与target=0的两数相加有点类似,不需要输出每个数字的下标,那么让4个数组两两一组(这样做可以让时间复杂度最小),每组两层遍历,找所有和的组合,再找两个和为0的次数方法:1. num1 和 num2 一组,各取一数找sum的个数和sum分别出现的次数2. num3 和 num4 同上,在求sum的时候判断sum的相反数是否已经在第一步出现过3. 统计出现过的次数。原创 2024-06-28 17:08:34 · 322 阅读 · 0 评论 -
Day.5 | 242.有效的字母异位词 349.两个数组的交集 202.快乐数 1.两数之和
要点:方法:要点:方法: 要点:方法:要点:方法:原创 2024-06-26 17:32:45 · 287 阅读 · 0 评论 -
Day.4 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 160.链表相交 142.环形链表II
24. 两两交换链表中的节点原创 2024-06-26 12:53:02 · 110 阅读 · 0 评论 -
Day.3 | 203.移除链表元素 707.设计链表 206.反转链表
要点:改变整个链表的指针方向,即全部朝后的,反转成全部朝前的,头上加个nullptr,尾巴的nullptr不要。假设 A -> B -> C 三个节点,B是要删除的节点,B删除后,A->next就变为C。要点:如果要学链表的话,必然需要学自定义一个链表,包括链表的增删改查操作。所以要删除一个节点,要关注三个节点,被删除的B,B前面的A,B后面的C。看懂双指针和递归的原理后,记住先保存,再转向,再移动,就不会出错。遍历到最后,pre就是反转后链表的头节点,cur为nullptr。cur = temp;原创 2024-06-24 14:22:36 · 304 阅读 · 0 评论 -
Day.2 | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II
要点:一个正整数数组,一个target,在数组中取一块连续的数据,这块数据里数值相加大于等于target,返回连续数据的最小长度,否则返回0。要点:有负数,但数组有序,直接原地算平方,大小会是一个峰-谷-峰的形状,所以找大小的时候从大的开始找起。要点:要返回一个n*n的二维数组,一圈一圈转进去,手画一下过程即可发现规律。然后就是固定i填充j,固定j填充i的套路,去填满nums[i][j]正方形4条边,一圈为一个循环,每次循环分别填充4条边的数据。取一个变量记录每次移动指针后窗口的长度,原创 2024-06-23 17:23:49 · 301 阅读 · 0 评论