- 博客(39)
- 收藏
- 关注
原创 代码随想录训练营打卡Day48| 单调栈 part02
42. 接雨水给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。思路:1. 找到右侧的下一个大值,然后中间的本部分是可以接雨水的部分2. 如果没有更大的值,寻找右侧的最大的小值【这种“从某个柱子出发找一对边界”的方式,这个柱子上面能不能放水?能放多少?你可以只关注位置 i(而不是一整段):左边有没有比它高的柱子?右边有没有比它高的柱子?如果两边都有,水面高度由决定那么需要维护两个数组一个右侧最大一个左侧最大,
2025-11-18 11:20:50
300
原创 代码随想录训练营打卡Day47| 单调栈 part01
是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。思路:首先,answer要求的是 i 天的几天后,所以先入栈的需要为日期较小的,即从左到右;其次,考虑的是天数差,而不是温度差,所以压入栈的应该为 i ,比较元素大小的时候使用。【因为nums1是nums2的子集,所以nums1一定能在nums2中找到对应的元素,思路:需要在nums2中找到更大的元素,和上一题的更温暖的思路是一致的;剩下的都是 “> num” 的数,并且。因为“我要找的是右侧的东西”,
2025-11-17 23:34:38
584
原创 代码随想录训练营打卡Day46| 动态规划part13
思路:布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。判断一个子字符串(字符串下标范围[i,j])是否回文,依赖于,子字符串(下标范围[i + 1, j - 1])) 是否是回文。A:s [i][i] 已经定义,并且左下三角区为非法区,当访问dp[i+1][j-1]为了避免越界需要有 i <= j。A:本题要求长度统计,所以 s [i][i] 自身为回文必定为1;,找出其中最长的回文子序列,并返回该序列的长度。
2025-11-14 10:14:59
367
原创 代码随想录训练营打卡Day45| 动态规划part12
一部分是不用s[i - 1]来匹配,个数为dp[i - 1][j],s 的前 i−1 个字符仍然要构成 t 的前 j 个字符。情况三:同时删word1[i - 1]和word2[j - 1],操作的最少次数为dp[i - 1][j - 1] + 2。dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j];当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两部分组成。情况一:删word1[i - 1],最少操作次数为dp[i - 1][j] + 1。
2025-11-13 21:10:56
1008
原创 代码随想录训练营打卡Day43 - 44| 动态规划part10、11i
给你一个整数数组nums,找到其中最长严格递增子序列的长度。是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组的子序列。思路:DP 的本质是“”,把全局问题拆成局部最优拼接;不能通过维护一个单调递增栈;
2025-11-12 21:31:42
824
原创 代码随想录训练营打卡Day41| 动态规划part09
你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。思路:和上一个买股票相比从2次改为k次,只需要在初始化的时候对参数进行处理即可;这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。思路:存在一天的冷冻期,那在计算持有的时候比较需要和 i-2 进行比较;你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。代表了交易股票的手续费用。
2025-11-07 15:25:08
299
原创 代码随想录训练营打卡Day40| 动态规划part08
DP 记录的是“到今天为止最优”,不是某个固定日子“已经卖过了就不再关注”的一次性事件。这意味着可以买卖一次,可以买卖两次,也可以不买卖;思路:需要记录从哪天购入和哪天售出,从动态规划来分析dp数组应该为二维;返回你可以从这笔交易中获取的最大利润。你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。设计一个算法来计算你所能获取的最大利润。设计一个算法来计算你所能获取的最大利润。从dp[n][2]拓展为dp[n][4];注意:这里的“第一次卖”“第二次卖”指的是。给定一个数组,它的第。
2025-11-07 14:36:32
264
原创 代码随想录训练营打卡Day39| 动态规划part07
如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。同时,相邻的房屋装有相互连通的防盗系统,如果不偷第i房间,那么dp[i] = dp[i - 1],即考 虑i-1房,(,今晚能够偷窃到的最高金额。
2025-11-06 19:43:20
578
原创 代码随想录训练营打卡Day38| 动态规划part06
这道题初始化会有点难想,dp[0] = 0比较常规,但是其他位置不能初始化为 0 , 而是初始化为一个不可能达到的大值(因为题目要求最少);思路:完全背包的应用,难点在于如何从数值转换到字符串的计算中;原来是 背包容量 - 物品占用空间,现在是原来的字符串 - 子串;是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。如果可以利用字典中出现的一个或多个单词拼接出。,表示不同面额的硬币;你可以认为每种硬币的数量是无限的。
2025-11-06 14:30:19
326
原创 代码随想录训练营打卡Day37| 动态规划part05
求解将哪些物品装入背包里物品价值总和最大。完全背包问题的一维数组情况 和 01背包的一位数组情况的区别:01背包是逆向更新,为了避免物品重复使用;完全背包是正向更新;
2025-11-05 23:41:44
304
原创 代码随想录训练营打卡Day36| 动态规划part04
题目链接:1049.最后一块石头的重量II有一堆石头,用整数数组stones表示。其中stones[i]表示第i块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为x和y,且x <= y。如果x == y,那么两块石头都会被完全粉碎;如果x!= y,那么重量为x的石头将会完全粉碎,而重量为y的石头新重量为y-x。最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回0。
2025-11-04 23:41:47
450
原创 代码随想录训练营打卡Day34| 动态规划part03
这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的空间,并且具有不同的价值。A:只要你的题能转成 “在若干个元素中选择一部分,使它们满足某个约束(≤ / = / 恰好),并使某个目标最大/是否可达”,就可以抽象成 0/1 背包。小明的行李空间为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料只能选择一次,并且只有选与不选两种选择,不能进行切割。思路:每一件物品其实只有两个状态,取或者不取【可以用回溯的思想来找到最优解,O(2^n)】;Q:这种抽象为01背包的思路是什么?
2025-11-03 19:01:07
402
原创 代码随想录训练营打卡Day33| 动态规划part02
通过对 7 - 9 的情况进行分析,拆分为 3 和 2 的情况乘积最大;思路:每一个状态是在上一个状态下进行推导的,所以用dp维护每个位置的路径;先对起点所在的行和列初始化为1【因为只能通过向下或向右达到】;思路:只有障碍的下方和右方会被影响,直接将dp表对应的地方置0;初始化起点的行列的时候也要考虑到障碍的存在;机器人试图达到网格的右下角(在下图中标记为 “Finish” )。网格的左上角 (起始点在下图中标记为 “Start” )。返回机器人能够到达右下角的不同路径数量。),并使这些整数的乘积最大化。
2025-11-03 16:42:53
254
原创 代码随想录训练营打卡Day32| 动态规划part01
感觉一遍有点难吃透前面的贪心,二刷的时候加油题目链接:509. 斐波那契数思路:难度简单,单纯的熟悉一下动态规划的感觉:每一个状态一定是由上一个状态推导;题目链接:70. 爬楼梯思路:应该是n-1阶有几种方法,从而推断n阶有几种方法;根据列DP表可知f(x) = f(x-1) + f(x-2);题目链接:746. 使用最小花费爬楼梯思路:使用DP表来维护最小话费; 表示到达“第 i 个台阶的顶面”所需的最小花费;
2025-10-30 15:12:08
381
原创 代码随想录训练营打卡Day31| 贪心算法part05
核心思想:每一步都选择当下看起来最优的选项,希望整体最优。关键条件“最优子结构”:局部最优能导出全局最优。“无后效性”:当前决策不影响后续最优决策。例题代表活动选择(Activity Selection)零钱兑换 II(但只取最大面值可行情况)Huffman 编码(最优合并问题)
2025-10-29 19:15:22
920
原创 代码随想录训练营打卡Day29| 贪心算法part03
1. 从高到矮排序,h降序,k升序,这样每插入一个新的元素,都是最矮的,直接插入到k对应的位置即可;,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回。思路:比较有意思,需要从身高和前面是否有身高大于等于的两个方面进行排序;2. 从矮到高排序,h升序,k降序,新的元素插入到k+1的空位置上即可;【从左往右和从右往左的情况不同,比较这个来选用最少的数目;你从其中的一个加油站出发,开始时油箱为空。请你给每个孩子分发糖果,计算并返回需要准备的。顾客排队购买你的产品,(按账单。
2025-10-27 14:25:44
529
原创 代码随想录训练营打卡Day27| 贪心算法part02
因为只能持有一只股票,所以前一天持有就只能不做或者卖出,前一天不持股只能买入或者不做。维护一个变量,可到达的最远距离【在循环的时候,需要判断能否到达当前位置】;思路:问最小跳跃次数,则遍历,每次都取得最大,维护能到达的最远距离变量,维护一次跳跃次数+1。思路:先对数组进行排序,从小到大然后先将负数变正,额外的次数变形绝对值小的;数组中的每个元素代表你在该位置可以跳跃的最大长度。多次买卖该股票,但要确保你持有的股票不超过一股。判断你是否能够到达最后一个下标,如果可以,返回。处,你可以跳转到任意。
2025-10-27 10:32:18
358
原创 代码随想录训练营打卡Day26| 贪心算法part01
题目链接:455.分发饼干思路:排序后从小到大匹配;题目链接:376. 摆动序列思路:如果通过滑动窗口(双指针)来维护的话,会能找到最长子序列吗?题目链接:53. 最大子序和思路:感觉会是动态规划的题;
2025-10-24 14:47:39
337
原创 代码随想录训练营打卡Day25| 回溯算法part04
491.递增子序列给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中。你可以按返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。思路:原数组并不有序,所以只判断相邻的并不是有效的剪枝;递增序列是指在path中递增,所以判断大小是在push的时候和path末尾元素相比;【使用了哈希表来对使用过的元素进行标记,从而达到去重的效果】
2025-10-23 15:12:47
364
原创 代码随想录训练营打卡Day24| 回溯算法part03
思路:剪枝判断条件:可以根据剩下的数字长度【需要一个额外参数来记录这是第几层】;不能含有前导 0!思路:存在重复元素,故可能存在重复子集,可以用哈希表去重;或者直接使用排序来,然后加入判断条件来去重;,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。思路:没有剪枝也没有终止条件,所有子集都放入结果中;,用以表示一个 IP 地址,返回所有可能的。返回的解集中,子集可以按。终止条件:到达第四层,并且没有剩余字符;返回该数组所有可能的子集(幂集)。之间组成,且不能含有前导。,这些地址可以通过在。
2025-10-21 16:01:12
249
原创 代码随想录训练营打卡Day23| 回溯算法part02
思路:终止条件是 sum == target,还要对 sum > target 进行剪枝;终止条件,path是回文串,则写入结果数组中;可以无限制重复选择,则循环的时候需要有“起始下标”,避免重复排列、搜索爆炸;字符串 s 的下标从 i 到 j 这一段(即 s[i..j])是否是回文串。如果至少一个数字的被选数量不同,则两种组合是不同的。思路:只能使用一次,则再递归的时候起始下标递增;否 → f[i][j] = false。中的每个数字在每个组合中只能使用。是 → f[i][j] = true。
2025-10-20 16:02:54
309
原创 代码随想录训练营打卡Day22| 回溯算法part01
思路:先用一个字典来存储 2 - 9 对应的字母;提取digits的长度,然后回到传统的解题方法;思路:用同样的思路来搭建框架,具体判断的条件从 == k再加一个之和 == n;给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。由于不是1到n,对于for来说需要限制一下push的内容。的字符串,返回所有它能表示的字母组合。更直观的for版本,省略了根据 k 来剪枝的部分。思路:看解析没太看懂,结合代码先熟悉内容吧;所有回溯法的问题都可以抽象为树形结构。17.电话号码的字母组合。
2025-10-19 17:20:54
188
原创 代码随想录训练营打卡Day20| 二叉树part8
669. 修剪二叉搜索树给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉搜索树,使得所有节点的值在中。修剪树改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。可以证明,存在。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。思路:和删除二叉搜索树思路相同,判断条件从相等变为不符合值的范围;
2025-10-17 19:10:14
261
原创 代码随想录训练营打卡Day19| 二叉树part7
二叉搜索树的不同点在于,左子树 < 根节点 < 右子树;你说你要去那边而我只能去往这边,或者在这里看着你的离开,那我们的分岔口已经到了。判断当前root的值是否属于同一个子树,如果是的话继续迭代,直到找到不同子树的时候返回最近的公共祖先;对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。思路:难度中等,但是根据根节点的值和val的大小递归调用即可;
2025-10-17 16:43:40
179
原创 代码随想录训练营打卡Day18| 二叉树part6
A:找到left没找到right,返回left【两者都找到的情况前面已经返回了root】,两个都没找到同样返回right,此时right == nullptr;中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(中序遍历为有序数组,维护maxCount和当前Count,更新的时候同样清空数组;二叉搜索树可是有序的,对二叉搜索树采用中序遍历,其实就是一个有序数组;给你一个含重复值的二叉搜索树(BST)的根节点。
2025-10-16 15:56:41
335
原创 代码随想录训练营打卡Day17| 二叉树part5
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。思路:检查左右子树和当前节点的大小关系;给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。返回以该节点为根的子树。通过给定的数组构建最大二叉树,并且输出这个树的根节点。思路:难度简单,检查节点值和目标值的大小关系递归即可;,判断其是否是一个有效的二叉搜索树。给定二叉搜索树(BST)的根节点。给你一个二叉树的根节点。
2025-10-16 11:37:55
160
原创 代码随想录训练营打卡Day16| 二叉树part4
题目链接:找树左下角的值思路:迭代法,维护两个队列即可【有点麻烦死脑筋了,直接从右往左遍历,取最后一个即可】;递归法,在树的最后一行找到最左边的值;路径总和题目链接:路径总和思路:有了上一题思路,递归很简单,只需要额外传递 target - val,同时回溯维护 target;题目链接:从中序与后序遍历序列构造二叉树思路:需要先从后序遍历找到根节点,然后在中序遍历中根据根节点切割出左右子树,递归处理;
2025-10-13 15:26:55
421
原创 代码随想录训练营打卡Day13| 二叉树part2: 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度
思路:第一眼没想到;看了思路后:只需要将左右子树互换即可【听起来就很适合递归】,明确思路后,递归很好解决;
2025-10-10 11:25:59
250
原创 代码随想录训练营打卡第十一天| 150. 逆波兰表达式求值,239. 滑动窗口最大值,347.前 K 个高频元素
给你一个字符串数组tokens,表示一个根据表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。'+''-''*''/'9该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9思路:难度中等,后缀表达式;遍历字符串的过程中,将数字压入栈中,遇到计算符则先弹出两个数字,进行计算,将结果压入栈中;
2025-10-08 17:11:42
513
原创 代码随想录训练营打卡第十天|232.用栈实现队列 ,225. 用队列实现栈,20. 有效的括号,1047. 删除字符串中的所有相邻重复项
栈忘记的差不多了,借此机会复习一下,更多的是学习部分。
2025-09-27 22:26:58
676
原创 代码随想录训练营打卡第九天|151.翻转字符串里的单词,卡码网:55.右旋转字符串
给你一个字符串s,请你反转字符串中的顺序。是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的分隔开。返回顺序颠倒且之间用单个空格连接的结果字符串。输入字符串s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。思路:通过对空格的检测,然后去重实现分割;分割后通过reverse函数进行倒置;遍历顺序可以从末尾向前遍历然后存放在新的串中,直接insert或者append;【需要双指针来获取整个单词的头尾】append。
2025-09-25 17:40:49
243
原创 代码随想录训练营打卡第八天|344.反转字符串,541. 反转字符串II,卡码网:54.替换数字
思路:要求原地修改输入数组、使用O(1)的额外空间;能不能用头尾指针向中间便利?【还真是这样】
2025-09-24 19:24:15
270
原创 代码随想录训练营打卡第七天| 454.四数相加II,383. 赎金信, 15. 三数之和,18. 四数之和
上一篇有点晚了写的太简单了,好像自己最后也没留下什么思路和收获。
2025-09-23 20:51:23
553
原创 代码随想录训练营打卡第六天|242.有效的字母异位词,349. 两个数组的交集, 202. 快乐数,1. 两数之和
哈希表的实现就是“把任意大小的数据映射到一个固定范围内的存储位置”,而常见的一种方法确实是。不过在实际实现中(比如 C++ STL 里的),不仅仅是取余,还会有更多优化。存储的是。键(key)用来查找,值(value)用来存储数据。类似字典或映射关系。。存储的是,没有与之关联的 value。本质上就是“无序的唯一集合”。Key。
2025-09-22 21:51:18
222
原创 代码随想录训练营打卡第四天|两两交换链表中的节点 , 删除链表的倒数第N个节点 ,链表相交,环形链表II
思路:看着很简单,一个临时结点,先写写试试迭代法很简单,但是递归法会比较要求理解(感觉脑子浆糊糊的;链表末尾情况:head->next = newHead->next, newHead->next = head;
2025-09-20 16:42:52
251
原创 代码随想录训练营打卡第三天|203.移除链表元素, 707.设计链表, 206.反转链表
思路:难度简单,但很久没用到链表了,具体的语句有点忘记了通过循环的方式,直到next为空:单指针,next.val == val时,head -> next = head.next -> next(大概是这样达到删除节点的操作看完文档后:发现递归在代码层面更加简单,但是需要理解。1.递归题解递归好绕,从尾节点往前推导,2 -> 6 -> 3,val = 6情况下:先判断3,head.val == 3!= val,返回head节点(节点3)
2025-09-19 21:30:00
1085
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅