自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录训练营总结

为期两个月的代码随想录训练营今天结束了,我想我的收获是非常大的。更令人安心的是知识星球对于学习进度的规划,细化到每一天每道题,可以看到内容的十足的用心,包括对关键定义的反复明确,层层递进的题目安排,环环相扣的思路步骤。本科四年虽然有学过算法分析相关的专业课,但对算法的实践一直是不敢上手无从下手的状态,经过训练营的学习,我想我对算法已经有了一定的自信和认识。对于找工无论还有多少方面亟待提升,算法这方面我相信自己已经有了底气,后面会循着形成的思路继续坚持,去到自己理想的工作岗位,与心爱的计算机长长久久。

2024-05-24 02:03:08 253

原创 代码随想录训练营day60 | 单调栈part03

是遥相呼应的两道题目,建议都要仔细做一做,原理上有很多相同的地方,但细节上又有差异,更可以加深对单调栈的理解。

2024-05-24 02:02:41 319

原创 代码随想录训练营day56 | 动态规划part17

【代码】代码随想录训练营day56 | 动态规划part17。

2024-05-24 02:02:34 237

原创 代码随想录训练营day59 | 单调栈part02

处理循环数组:将两个nums数组拼接在一起,使用单调栈计算出每一个元素的下一个最大值,最后再把结果集即result数组resize到原数组大小就可以了。

2024-05-24 02:02:16 238

原创 代码随想录训练营day57 | 单调栈part01

栈头到栈底的顺序,要从小到大,也就是保持栈里的元素为递增顺序。只要保持递增,才能找到右边第一个比自己大的元素。本题其实就是找找到一个元素右边第一个比自己大的元素,此时就应该想到用单调栈了。使用单调栈,首先要想单调栈是从大到小还是从小到大。本题和739. 每日温度是一样的。

2024-05-24 02:02:08 221

原创 代码随想录训练营day55 | 动态规划part16

相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的。

2024-05-24 02:01:58 234

原创 代码随想录训练营day54 | 动态规划part15

【代码】代码随想录训练营day54 | 动态规划part15。

2024-05-24 02:01:48 173

原创 代码随想录训练营day53 | 动态规划part14

直线不能相交,这就是说明在字符串A中 找到一个与字符串B相同的子序列,且这个子序列不能改变相对顺序,只要相对顺序不改变,链接相同数字的直线就不会相交。区别在于这里不要求是连续的了,但要有相对顺序,即:"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。绘制一些连接两个数字 A[i] 和 B[j] 的直线,只要 A[i] == B[j],且直线不能相交。

2024-05-24 02:01:38 284

原创 代码随想录训练营day52 | 动态规划part13

要求两个数组中最长重复子数组,如果是暴力的解法 只需要先两层for循环确定两个数组起始位置,然后再来一个循环可以是for或者while,来从两个起始位置开始比较,取得重复子数组的长度。首先通过本题大家要明确什么是子序列,“子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序”。注意题目中说的子数组,其实就是连续子序列。最大的区别在于“连续”。

2024-05-24 02:01:26 234

原创 代码随想录训练营day50 | 动态规划part12

本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。,本题加上了一个冷冻期。

2024-05-24 02:01:16 295

原创 代码随想录训练营day49 | 动态规划part11

关键在于至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖。的进阶版,这里要求至多有k次交易。

2024-05-24 02:01:05 237

原创 代码随想录训练营day48 | 动态规划part10

因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。

2024-05-24 02:00:55 182

原创 代码随想录训练营day47 | 动态规划part09

所以这里就更感觉到,当前状态和前面状态会有一种依赖关系,那么这种依赖关系都是动规的递推公式。与198.打家劫舍,213.打家劫舍II一样,关键是要讨论当前节点抢还是不抢。仔细一想,当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了。是差不多的,唯一区别就是成环了。

2024-05-24 02:00:43 352

原创 代码随想录训练营day46 | 动态规划part08

单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。拆分时可以重复使用字典中的单词,说明就是一个完全背包。

2024-05-23 21:18:35 166

原创 代码随想录训练营day45 | 动态规划part07

题目中说每种硬币的数量是无限的,可以看出是典型的完全背包问题。每一阶可以重复使用,例如跳了1阶,还可以继续跳1阶。1阶,2阶,.... m阶就是物品,楼顶就是背包。问跳到楼顶有几种方法其实就是问装满背包有几种方法。

2024-05-23 21:16:23 232

原创 代码随想录训练营day44 | 动态规划part06

本题题目描述说是求组合,但又说是可以元素相同顺序不同的组合算两个组合,但本题和纯完全背包不一样,

2024-05-23 21:13:19 200

原创 代码随想录训练营day43 | 动态规划part05

本题物品的重量为stones[i],物品的价值也为stones[i]。对应着01背包里的物品重量weight[i]和 物品价值value[i]sum += i;//初始化dp数组i++) {//采用倒序j--) {//两种情况,要么放,要么不放。

2024-05-23 21:10:30 245

原创 代码随想录训练营day42 | 动态规划part04

【代码】代码随想录训练营day42 | 动态规划part04。

2024-05-23 21:06:36 183

原创 代码随想录训练营day41 | 动态规划part03

【代码】代码随想录训练营day41 | 动态规划part03。

2024-05-23 21:04:49 168

原创 代码随想录训练营day39 | 动态规划part02

【代码】代码随想录训练营day39 | 动态规划part02。

2024-05-23 21:02:24 181

原创 代码随想录训练营day38 | 动态规划part01

从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的。所以到第三层楼梯的状态可以由第二层楼梯 和 到第一层楼梯状态推导出来,那么就可以想到动态规划了。dp[i]的定义为:第i个数的斐波那契数值是dp[i]那么第一层楼梯再跨两步就到第三层 ,第二层楼梯再跨一步就到第三层。爬到第一层楼梯有一种方法,爬到二层楼梯有两种方法。1)确定dp数组以及下标的含义。5)举例推导dp数组。

2024-05-23 21:00:01 323

原创 代码随想录训练营day37 | 贪心算法part06

本题只要想清楚个例,例如98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]减一,strNum[i]赋值9,这样这个整数就是89。就可以很自然想到对应的贪心解法了。

2024-05-23 20:53:13 296

原创 代码随想录训练营day36 | 贪心算法part05

按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了。2、736.划分字母区间在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。3、56.合并区间先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。按照左边界从小到大排序之后,如果 即intervals[i]的左边界

2024-05-23 20:50:15 233

原创 代码随想录训练营day35 | 贪心算法part04

局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。

2024-05-23 20:47:03 253

原创 代码随想录训练营day34 | 贪心算法part03

情况二:rest[i] = gas[i]-cost[i]为一天剩下的油,i从0开始计算累加到最后一站,如果累加没有出现负数,说明从0出发,油就没有断过,那么0就是起点。情况三:如果累加的最小值是负数,汽车就要从非0节点出发,从后向前,看哪个节点能把这个负数填平,能把这个负数填平的节点就是出发节点。此时局部最优:只要右边评分比左边大,右边的孩子就多一个糖果,全局最优:相邻的孩子中,评分高的右孩子获得比左边孩子更多的糖果。这道题目一定是要确定一边之后,再确定另一边,例如比较每一个孩子的左边,然后再比较右边,

2024-05-23 20:43:59 323

原创 代码随想录训练营day32 | 贪心算法part02

局部最优:收集每天的正利润,全局最优:求得最大利润。2、55.跳跃游戏贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。3、45.跳跃游戏II贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最少步数

2024-05-23 20:40:35 230

原创 代码随想录训练营day31 | 贪心算法part01

局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。可以尝试使用贪心策略,先将饼干数组和小孩数组排序。全局最优:选取最大“连续和”

2024-05-23 20:34:15 230

原创 代码随想录训练营day30 | 回溯算法part06

是因为每一行每一列只放一个皇后,只需要一层for循环遍历一行,递归来遍历列,然后一行一列确定皇后的唯一位置。

2024-05-23 20:25:21 331

原创 代码随想录训练营day29 | 回溯算法part05

而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。所以不能使用之前的去重逻辑。是通过排序,再加一个标记数组来达到去重的目的。注意子序列的定义,与子集区分开。46.给的是不重复数字序列。优化,使用哈希map。

2024-04-17 01:40:51 417

原创 代码随想录训练营day28 | 回溯算法part04

区别就是集合里有重复元素了,而且求取的子集要去重。方法一,StringBuilder。不使用标记数组 used。使用标记数组 used。

2024-04-17 01:21:31 228

原创 代码随想录训练营day27 | 回溯算法part03

回溯+动态规划优化回文串判断。2、40.组合总和II。3、131.分割回文串。

2024-04-16 05:22:27 250

原创 代码随想录训练营day25 | 回溯算法part02

无非就是多了一个限制,本题是要找到和为n的k个数的组合,而整个集合已经是固定的了[1,...,9]。本题就是在[1,2,3,4,5,6,7,8,9]这个集合中找到和为n的k个数的组合。之后,本题是简单一些了。

2024-04-14 02:34:10 183

原创 代码随想录训练营day24 | 回溯算法part01

【代码】代码随想录训练营day24 | 回溯算法part01。

2024-04-14 01:16:07 150

原创 代码随想录训练营day23 | 二叉树part09

换一个角度来看,这就是一个有序数组[2, 5, 13],求从后到前的累加数组,也就是[20, 18, 13],那么知道如何遍历这个二叉树,也就迎刃而解了,从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了。递归:左闭右开 [left,right)递归:左闭右闭 [left,right]迭代:左闭右闭 [left,right]

2024-04-12 00:08:15 109 1

原创 代码随想录训练营day22 | 二叉树part08

【代码】代码随想录训练营day22 | 二叉树part08。

2024-04-10 01:39:31 166 1

原创 代码随想录训练营day21 | 二叉树part07

如果不是二叉搜索树,最直观的方法一定是把这个树都遍历了,用map统计频率,把频率排个序,最后取前面高频的元素的集合。遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了。本题是二叉搜索树,既然是搜索树,它中序遍历就是有序的。中序遍历,利用二叉搜索树特性,不使用额外空间。,二叉搜索树可是有序的。统一迭代法,中序遍历。

2024-04-10 01:29:00 173 1

原创 代码随想录训练营day20 | 二叉树part06

构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。其实和遍历一个树逻辑是一样的,只不过传入两个树的节点,同时操作。迭代,利用二叉搜索树特点,优化,可以不需要栈。递归,利用二叉搜索树特点优化。如何同时遍历两个二叉树呢?

2024-04-10 01:12:52 221 1

原创 代码随想录训练营day18 | 二叉树part05

那么如何找最左边的呢?可以使用前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左优先就行),保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。首先回忆一下如何根据两个顺序构造一个唯一的二叉树,就是以 后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。可以使用深度优先遍历的方式(本题前中后序都可以,无所谓,因为中节点也没有处理逻辑)来遍历二叉树。如果使用递归法,如何判断是最后一行呢,其实就是深度最大的叶子节点一定是最后一行。

2024-04-10 00:38:11 288 1

原创 代码随想录训练营day17 | 二叉树part04

这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。通过本题可以了解求二叉树深度 和 二叉树高度的差异,求深度适合用前序遍历,而求高度适合用后序遍历。本题迭代法其实有点复杂,可以有一个思路,也不一定说非要写出来。这道题目要求左叶子之和,其实是比较绕的,因为不能判断本节点是不是左叶子节点。本题迭代法使用前中后序都是可以的,只要把左叶子节点统计出来就可以了。此时就要通过节点的父节点来判断其左孩子是不是左叶子了。我们先使用递归的方式,来做前序遍历。

2024-04-09 12:36:55 177

原创 代码随想录训练营day16 | 二叉树part03

那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,不过这个最小距离 也同样是最小深度。本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。以下讲解中遍历顺序上依然采用后序遍历(因为要比较递归返回之后的结果,本文我也给出前序遍历的写法)。本题依然是前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。

2024-04-09 03:02:24 265

空空如也

空空如也

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

TA关注的人

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