自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 代码随想录算法训练营第五十八天| 739. 每日温度、496.下一个更大元素 I

思路:定义一个从栈顶到栈底递增的栈,记录数组下标。若当前元素小于等于栈顶,说明未找到更高温度,直接入栈即可保持栈单调。若当前元素大于栈顶,说明找到了比栈顶大的元素,两者的下标差即为栈顶元素对应的下标的结果,记录该下标差,并弹出栈顶,继续判断新的栈顶,直至当前元素于等于栈顶,然后入栈。中相同元素的下标,并记录在结果数组中。中元素的右侧最大元素,则用哈希表寻找。来建立单调栈,若找到。

2023-05-11 14:27:22 87

原创 代码随想录算法训练营第五十七天| 647.回文子串、516.最长回文子序列

【代码】代码随想录算法训练营第五十七天| 647.回文子串、516.最长回文子序列。

2023-05-10 20:45:31 79

原创 代码随想录算法训练营第五十六天| 583.两个字符串的删除操作、72.编辑距离

【代码】代码随想录算法训练营第五十六天| 583.两个字符串的删除操作、72.编辑距离。

2023-05-09 11:34:06 79

原创 代码随想录算法训练营第五十五天| 392. 判断子序列、115.不同的子序列

【代码】代码随想录算法训练营第五十五天| 392. 判断子序列、115.不同的子序列。

2023-05-08 22:50:47 82

原创 代码随想录算法训练营第五十三天| 1143.最长公共子序列、1035.不相交的线、53.最大子数组和

思路:可以发现,只要按顺序连就不会相交,即题目可以转换为求两个数组中的最长公共子序列,与。结尾的子数组,若要和前面的数字连成一个子数组,则和最大的一定是和以。虽然没有意义,但初始化为0,可用于推出。,则此时拼接的子数组和大于单个。的最长公共子序列的长度。中的最长公共子序列分别加上。中取,二者取大的,即长度为。结尾的最大和子数组拼接。,则拼接的子数组和小于单个。时,最长公共子序列一定为。时,最长公共子序列可能从。

2023-05-07 14:48:45 242

原创 代码随想录算法训练营第五十二天| 300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组

虽然没有意义,但初始化为0,可用于推出。结尾的最长递增子序列的长度。结尾的最长递增子序列的长度。为结尾的最长递增子序列后,长度为。,递增子序列的长度至少为1(只取。结尾的最长重复子数组的长度。,则最长递增子序列为以。

2023-05-05 20:09:44 45

原创 代码随想录算法训练营第五十一天| 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

类似,但卖出时因扣掉手续费,即。

2023-05-04 14:20:08 54

原创 代码随想录算法训练营第五十天| 123.买卖股票的最佳时机 III、188.买卖股票的最佳时机 IV

类似,规定最多k次交易,可定义。

2023-05-04 14:19:06 597

原创 代码随想录算法训练营第四十九天| 121.买卖股票的最佳时机、122.买卖股票的最佳时机 II

类似,但由于可以无限次买入买出,因此当昨天不持有今天持有时,即今天买入时,可以继承昨天剩下的现金,时,手上才持有的最大现金。持有股票时,现金可以为负。

2023-05-02 22:54:11 46

原创 代码随想录算法训练营第四十八天| 198.打家劫舍、213.打家劫舍 II、337.打家劫舍 III

思路:由于第一个房子和最后一个房子不能同时偷,因此可以分开考虑,先考虑不偷第一个房子的情况,再考虑不偷最后一个房子的情况,再比较二者取大的。思路:后序遍历二叉树,递归返回值为偷或不偷当前节点时子树的最大金额。对于每个节点,若偷当前节点,则金额为。

2023-05-02 00:26:45 41

原创 代码随想录算法训练营第四十六天| 139.单词拆分、多重背包、多重背包总结

有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。由于该题中需要考虑排列,因此需先遍历背包再遍历物品。思路:完全背包问题。字典中的单词为物品,字符串。

2023-04-29 15:58:38 58

原创 代码随想录算法训练营第四十五天| 70.爬楼梯 (进阶)、322.零钱兑换、279.完全平方数

思路:完全背包问题。思路:完全背包问题。

2023-04-28 11:36:51 35

原创 代码随想录算法训练营第四十四天| 完全背包、518 零钱兑换 II、377 组合总和 Ⅳ

思路:由于顺序不同的序列被视作不同的组合吗,因此该题是完全背包求排列个数问题。思路:完全背包求组合个数问题。同一件物品可以使用无数次。先遍历背包时,考虑背包容量。先遍历物品时,考虑物品为。

2023-04-27 18:56:00 34

原创 代码随想录算法训练营第四十三天| 1049.最后一块石头的重量 II、494.目标和、474.一和零

1049思路:问题可以转化为:将这堆石头分成重量尽可能相同的两组,这样剩下重量最小。因此,可以转化为背包容量为sum/2,价值等于重量的0-1背包问题。当求出背包容量为sum/2时可装的最大质量dp[target]后,另一堆的质量为,由于sum/2向下取整,因此最后剩下的石头重量为。

2023-04-26 21:56:53 36

原创 代码随想录算法训练营第四十二天| 01背包问题 二维、01背包问题 一维、416. 分割等和子集

每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。时,物品的最大价值,即物品的总重量正好等于。遍历顺序先物品后背包,遍历背包时倒叙。有n件物品和一个最多能背重量为。思路:参考0-1背包,背包容量为。遍历顺序先背包和先物品都可。分割成两个子集,子集和为。,等价于,当背包最大容量为。

2023-04-25 20:01:49 54

原创 代码随想录算法训练营第四十一天| 343.整数拆分、96.不同的二叉搜索树

未知,但一定大于等于2,因此。使得乘积最大,一定是拆分成。个近似相同的子数相乘。

2023-04-24 13:10:18 28

原创 代码随想录算法训练营第三十九天| 62.不同路径、63.不同路径 II

思路:每次只能向下或向右走,因此可以将该过程抽象为一棵二叉树;到达终点及叶子节点为终点,可通过DFS遍历得到符合的叶子节点数。代码:一维滚动数组->空间优化。代码:一维滚动数组->空间优化。思路:不论怎么走,都是走。

2023-04-23 12:04:59 320

原创 代码随想录算法训练营第三十八天| 509.斐波那契数 、70.爬楼梯、746.使用最小花费爬楼梯

代码:空间优化,只保存两个数。

2023-04-21 16:17:49 38

原创 代码随想录算法训练营第三十七天| 738.单调递增的数字 、968.监控二叉树

对于空节点,若无覆盖,则叶子节点就要放摄像头,不行;若有摄像头,则叶子节点的父节点就无需安摄像头,最终叶子节点将不被覆盖;因此空节点为有覆盖状态。思路:从下往上遍历二叉树,让叶子节点的父节点放摄像头,然后隔两个节点安摄像头,使得整体数量最少。,并将后面的数字全变为9即可。思路:从后往前遍历,当。

2023-04-20 13:58:42 43

原创 代码随想录算法训练营第三十六天| 435. 无重叠区间 、763.划分字母区间、56. 合并区间

然后遍历字符串,当找到之前遍历过的所有字母的最远边界,则该边界就是分割点。具体的,当最远边界下标等于当前下标时,说明此前的所有字母最远就到当前位置。然后,依次比较两个区间,当两个区间发生重叠时,为使需要移除区间的数量最小,应移除更可能与后续区间发生重叠的区间,即右边界更大的区间。思路:参考重叠区间的做法。将这些区间划分成互不重叠的组,即在数组中不重叠的位置进行分割。思路:与重叠区间类似,按左边界进行排序,将区间数组分割成互不重叠的组。具体的,若相邻区间重叠则合并,不重叠则分割,并记录之前的合并结果。

2023-04-19 12:17:49 39

原创 代码随想录算法训练营第三十五天| 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

收到20元时,找零三张5元或一张10元一张5元。由于5元既可用于10元又可用于20元的情况,而10元只能用于20元的找零,因此当收到20元时,优先找10+5,若不行则尝试三张5元。这样,每个人的前面都是身高大于等于自己的人,且同身高的人的相对顺序正确(身高相同,若排在后面,则前面满足要求的人肯定多,即。思路:要使箭的数量最少,则同一支箭应引爆尽可能多的有重叠的气球。已经有序,此时低身高的插入一个有序的高身高队列,不会影响原队列的顺序。由于每个人的前面都是身高大于等于自己的人,因此插入。

2023-04-18 20:47:05 29

原创 代码随想录算法训练营第三十四天| 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

先从头遍历,考虑右边评分大于左边的情况:若右边评分比左边大,则右边的糖果比左边多1,否则给1个糖果。然后从尾部开始遍历,考虑左边评分大于右边的情况:若左边评分大于右边,即。当存在负数时,最小的数绝对值最大,反转可以得到最大的正数;当都为正时,反转最小的数可得绝对值最小的负数。先从头将负数取反,这样保证越小的负数越先取反。不论分了几段,累加一定小于0。的总和大于等于0,则说明存在解。开始,到末尾的累加一直大于0,则说明。的总和大于等于0,因此。的累加的绝对值一定大于。的累加小于0,这与到。

2023-04-17 21:37:12 43

原创 代码随想录算法训练营第三十二天| 122.买卖股票的最佳时机 II、55.跳跃游戏、45.跳跃游戏 II

思路:以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数。移动到当前覆盖范围的终点时,说明到下一个位置需要多走一步,因此步数+1,并将下一步最大范围作为新的当前覆盖范围,若该范围大于等于数组末尾,则当前步数即为最小步数;否则,继续在新的范围内移动。思路:将每天的价格画成折线图,找到波峰和波谷,波谷买入,波峰卖出。因此,可记录每次转折时的状态,接下来若遇到与记录状态相反的状态则进行买入/卖出操作,并记录新的状态。因此每天都先卖再买,可以算出每天的利润,将其中的正利润相加即可得到最大利润。

2023-04-16 00:07:32 24

原创 代码随想录算法训练营第三十一天| 455.分发饼干、376.摆动序列、53.最大子数组和

思路:将整个数组画为折线图,最长的摆动序列即为首末元素加上中间的波峰波谷。对于梯形情况,从不变到递增记为波谷,不变到递减记为波峰。末尾元素一定能找到前一个峰/谷,因此默认加入序列。相反,说明找到峰/谷,该元素加入序列,并记录状态。注意,为了处理不严格单调序列中的元素相等情况,思路:为了喂饱更多的小孩,饼干要物尽其用,大尺寸的饼干分给他能满足的最大胃口的小孩。时,记录当前状态,并将首元素加入序列。,则往后继续累加一定比只累加后续元素大。,那么一定会拖累后续元素累加的和。思路:对数组元素逐个累加为。

2023-04-15 23:23:10 43

原创 代码随想录算法训练营第三十天| 332.重新安排行程、51. N皇后、37. 解数独

这样,搜索到的第一条有效行程即是字典排序最小的有效行程,通过给回溯函数设置返回值提前返回。当存在多种有效行程时,选择字典排序小的,因此可以先对机票数组按每张机票的终点进行字典排序,从而保证在。这样,每层递归时,可通过起点快速查询可行的终点即次数,避免了。的排列问题,只不过排列时需要满足上一节点的终点等于当前节点的起点这一条件。思路:在每层递归中,都从头开始,找到第一个空格,填数,再进入下层递归找下一个数。记录每一起点对应的可行终点及可行次数,次数为该起点终点的机票张数。时,通过记录的使用过的列和斜线。

2023-04-13 15:09:53 37

原创 代码随想录算法训练营第二十八天| 93.复原IP地址、78.子集、90.子集II

思路:本题也是分割问题。题目确定了分割段数为4段,而割3次就能确定4段。因此,终止条件为分割3次时,判断第4段是否合法,若合法则加入。思路:相较于组合问题求的是到叶子节点的路径,子集问题就是收集每一个节点的路径。判断每段地址的合法性:长度不为0,不出现除数字外的其他字符,不含前导。思路:即在有重复求组合的基础上,收集每个节点路径。具体的分割操作为在原字符串中加入。

2023-04-12 10:58:52 31

原创 代码随想录算法训练营第二十九天| 491.递增子序列、46.全排列、47.全排列 II

思路:求子序列不能对原数组进行排序。通过求子集的方式求子序列,由于本身要求是递增子序列,因此判断递增的同时也进行了去重。思路:全排列的去重,即在原来的基础上进行树层去重即可。,在单层递归中直接遍历数组,同时进行树枝去重。思路:排列问题,不用。

2023-04-12 10:58:11 33

原创 代码随想录算法训练营第二十七天| 39. 组合总和、40.组合总和II、131.分割回文串

思路:数组中的元素不可重复选取,但数组中存在重复元素。为了去重,首先对原数组进行排序,防止由于顺序不同导致的重复。这样,得到的所有组合都将按序排列,且搜索时重复元素一定相邻。在单层递归中,由于元素在同一个组合内可以重复,但两个组合不能重复,因此需避免同一树层的重复,即在。先选取一个分割点,再在分割点右侧子数组中选取下一个分割点,若分割到数组末尾则分割结束。思路:由于数组中的元素可重复选取,因此每次选完当前元素后,递归数组的。开始的所有组合的子集,因此会导致重复,此时避免选择。,待选择的数组元素集合。

2023-04-10 21:09:56 26

原创 代码随想录算法训练营第二十五天| 216.组合总和III、17.电话号码的字母组合

思路:与77类似,先取在当前数组中。循环的范围为当前元素对应的字符集合。思路:相当于根据数字映射,对每个。考虑两种情况的剪枝:1.

2023-04-08 00:47:32 30

原创 代码随想录算法训练营第二十四天| 77. 组合

个,原问题和子问题相同就可以用递归;由于是求所有组合,因此单个元素的选择需考虑所有情况,因此递归就应写在一个。,后面的数组大小一定无法满足找到符合要求的组合,可直接不考虑。个元素,则先从原数组中选择一个。循环中,这也和回溯模板相对应。思路:假设当前层递归考虑的是。思路:可以这么理解,我要从。个元素,接下来考虑的数组为。,因此循环时只需循环至。,则大小一定大于等于。

2023-04-07 12:37:21 28

原创 代码随想录算法训练营第二十三天| 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

思路:升序数组即为一个二叉搜索树的中序遍历,为构造平衡搜索树,可选中间节点作为根节点,再通过左侧数组和右侧数组分别构造左子树和右子树。思路:若当前节点在给定区间内,则当前节点不用处理,直接递归处理左右子树;思路:按右中左顺序遍历可得降序数组,则每个节点的值都为之前节点累加+当前节点的值。,因此可直接放弃右子树,对左子树递归修剪,并返回左孩子给上层;,则说明该节点的右子树所有元素都大于。

2023-04-06 10:46:08 31

原创 代码随想录算法训练营第二十二天| 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

思路:若p,q在节点的两侧,则该节点一定是最近公共祖先;在搜索树中,在pq两侧说明节点大小在。思路:只需在原二叉树不变的情况下,根据大小关系找到空节点并在该位置插入,即可满足要求。思路:若当前节点是要删除的节点,则处理完后返回,否则处理左右。的节点一定为最近公共祖先。

2023-04-06 02:05:19 27

原创 代码随想录算法训练营第二一天| 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

采用pre保存前一个节点,处理中间节点时,计算中间节点与上一节点的绝对差,并和当前最小绝对差比较。即使已经找到公共祖先,他也会当作只找到了一个节点,并在另一子树中尝试寻找另一个节点,而此时另一子树一定返回。思路:搜索树中序遍历递增,此时所有重复的节点一定相邻,因此可依次记录节点值的出现次数。思路:求最近公共祖先,需从下到上处理二叉树,因此考虑后序遍历。,若返回都不为空,则说明当前节点即为公共祖先,直接返回当前节点。若次数大于当前最大值,则当前的结果数组中的值都失效,因此清空。,因此最近公共祖先能一路返回。

2023-04-04 17:27:50 33

原创 代码随想录算法训练营第二十天| 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

思路:采用层序遍历,将两个树的节点同时加入队列。一次弹出两个节点,当两个节点的左节点都非空,则一起压入队列,否则,直接等于非空节点。思路:采用前序遍历,先合并中间节点,再合并左右子树。思路:前序遍历,先判断左子树中的最大值是否小于当前节点,再递归左子树判断是否是二叉搜索;思路:先从数组中找到最大值,构造根节点,再分别递归左侧数组和右侧数组,构造左子树和右子树。思路:中序遍历时,保存前一个节点,每次判断当前节点是否大于前一个节点。思路:采用前序遍历,先合并中间节点,再合并左右子树。

2023-04-03 14:07:32 39

原创 代码随想录算法训练营第十八天| 513.找树左下角的值、112. 路径总和 113.路径总和ii、106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树

因此,可采用中左右顺序遍历,当遍历到叶子节点时,比较深度是否大于记录的最大深度,若大于则记录新的值与新的最大深度。思路:中序为左中右,后序为左右中,因此后序的最后一个元素即为根节点,通过该根节点去分割中序,得到左子树的中序和右子树的中序,通过左子树中序的size分割后序,得到左右子树的后序,然后分别递归进一步分割左右子树。思路:维护两个栈,一个存节点和值的pair,一个存路径,对于叶子节点判断和是否相等。思路:维护两个栈,一个存节点,一个存路径和,对于叶子节点判断和是否相等。

2023-04-02 12:56:31 40

原创 代码随想录算法训练营第十七天| 110.平衡二叉树、 257. 二叉树的所有路径、 404.左叶子之和

思路:判断是否平衡,即判断每个节点的左右子树高度差是否小于等于1。因此,可采用后序遍历的方式,先求左右孩子高度,若左右孩子高度差小于等于1,则返回当前节点高度,否则当前子树不平衡,返回-1。另外,若左右孩子至少一个高度为-1,说明已经不平衡,无需再计算高度差,直接返回-1。在单层递归中,先将当前节点加入路径,然后向左右孩子进行递归以寻找叶子节点。思路:用栈完成前序遍历,一个栈保存节点,另一个栈保存对应节点的路径。思路:遍历节点,并判断每个节点的左孩子是否是叶子节点,若是则将值累加。

2023-03-31 20:30:17 34

原创 代码随想录算法训练营第十六天| 104.二叉树的最大深度、111.二叉树的最小深度、 222.完全二叉树的节点个数

思路:统计节点个数,可通过递归得到左右子树的节点树,再加上当前节点即可。但是,只有左右孩子都为空的节点才为叶子节点,因此,若左右子树有一个为空,即深度为0,另一个非空,则应取大的(不为0)再加1.思路:采用迭代遍历,当处理的节点对应的子树为满二叉树时,无需再将该节点的孩子压入栈中,只需计算该满二叉树的节点数并加到节点总数(结果)中即可。因此,可采用递归,结束条件为遇到空节点,单层递归中先求左右节点的高度,然后取大的+1。思路:采用层序遍历,直到第一次遇到叶子节点(左右孩子都为空),此时的深度即为最小深度。

2023-03-30 16:15:49 35

原创 代码随想录算法训练营第十五天|二叉树的层序遍历、226.翻转二叉树、101.对称二叉树

每次从队列弹出两个节点进行比较,并将两个节点的孩子压入队列,其中,两个对称位置的孩子需依次压入,以便之后能同时弹出进行比较。在单层递归中,先比较两个节点是否相等,再比较左节点的左子树和右节点的右子树是否相等,再比较左节点的右子树和右节点的左子树是否相等;思路:可参考前序遍历,此时对一个节点的处理操作为交换该节点的左右孩子(并非交换左右孩子的值,而是交换两棵子树)。思路:对称二叉树即比较根节点的两棵子树是否对称,因此递归函数的参数为待比较的两棵树的根节点,返回值为。思路:参考前序遍历的迭代。

2023-03-29 21:56:59 67

原创 代码随想录算法训练营第十四天| 二叉树part01、理论基础、递归遍历、迭代遍历、统一迭代

因此,为了统一迭代方式,可以对已经访问过的元素进行标记,这样,当下次弹出元素为已访问元素时,就可直接处理(加入。前序:由于前序遍历顺序为中左右,即当前节点->左子树->右子树,因此访问的元素和要处理的元素顺序是一致的,每次访问的元素即为需处理(遍历,加入。中序:由于中序遍历顺序为左子树->当前节点->右子树,处理顺序和访问顺序不一致,每次访问的元素不等于需要处理的元素,即无法直接弹出栈顶加入。后序:访问顺序左->右->中,即中->右->左的倒序,因此可参考前序遍历先按中->右->左顺序遍历,再进行反向。

2023-03-28 19:50:57 73

原创 代码随想录算法训练营第十三天| 239. 滑动窗口最大值、347.前 K 个高频元素

当滑动队列时,若需要弹出的元素等于队头元素,说明当前的最大值不在新的窗口中,因此弹出队头,否则由于需要弹出的元素不是最大值,因此弹出与否不影响当前窗口的最大值,所以不操作。需要插入的元素需与队尾元素挨个比较,将小于该元素的队尾元素依次弹出,然后插入该元素,因为小于当前元素的队尾元素比当前元素早插入,因此本该早弹出,而它们的值小于当前元素,因此在他们的生命周期内不可能成为最大元素,所以无需维护,弹出即可,从而保证队列的单调性。其次,需要其中前k个高频元素,因此可以构建一个小顶堆,当堆元素小于k时,直接插入;

2023-03-27 21:58:28 33

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除