自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录训练营day43

理解成多重背包的同学主要是把m和n混淆为物品了,感觉这是不同数量的物品,所以以为是多重背包。只不过这个背包有两个维度,一个是m 一个是n,而不同长度的字符串就是不同大小的待装物品。dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]。所以我们要求的是 x - (sum - x) = target。假设加法的总和为x,那么减法对应的总和就是sum - x。此时问题就转化为,装满容量为x的背包,有几种方法。而m 和 n相当于是一个背包,两个维度的背包。但本题其实是01背包问题!

2024-04-26 22:31:33 228

原创 代码随想录训练营day42

背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值。背包如果正好装满,说明找到了总和为 sum / 2 的子集。以上分析完,我们就可以套用01背包,来解决这个问题了。背包中每一个元素是不可重复放入。背包的体积为sum / 2。

2024-04-22 23:19:45 162

原创 代码随想录训练营day41

那么从1遍历j,比较(i - j) * j和dp[i - j] * j 取最大的。从递归公式上来讲,dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] 中以j为头结点左子树节点数量为0,也需要dp[以j为头结点左子树节点数量] = 1, 否则乘法的结果就都变成0了。j的结束条件是 j < i - 1 ,其实 j < i 也是可以的,不过可以节省一步,例如让j = i - 1,的话,其实在 j = 1的时候,这一步就已经拆出来了,重复计算,所以 j < i - 1。

2024-04-18 22:29:52 795

原创 代码随想录训练营day39

从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值。那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。下标(0, j)的初始化情况同理。

2024-04-17 22:25:21 831

原创 代码随想录训练营day38

对于动态规划问题,我将拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组。

2024-04-14 10:13:09 638

原创 代码随想录训练营day37

代码随想录(1)贪心简单题以下三道题目就是简单题,大家会发现贪心感觉就是常识。是的,如下三道题目,就是靠常识,但我都具体分析了局部最优是什么,全局最优是什么,贪心也要贪的有理有据!贪心算法:分发饼干贪心算法:K次取反后最大化的数组和贪心算法:柠檬水找零(2)贪心算法中等题贪心中等题,靠常识可能就有点想不出来了。开始初现贪心算法的难度与巧妙之处。贪心算法:摆动序列贪心算法:单调递增的数字(3)贪心解决股票问题。

2024-04-12 11:52:09 971

原创 代码随想录训练营day36

此时问题就是要求非交叉区间的最大个数。这里记录非交叉区间的个数还是有技巧的,如图:区间,1,2,3,4,5,6都按照右边界排好序。当确定区间 1 和 区间2 重叠后,如何确定是否与 区间3 也重贴呢?就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,如果这个最小值也触达到区间3,那么说明 区间 1,2,3都是重合的。接下来就是找大于区间1结束位置的区间,是从区间4开始。那有同学问了为什么不从区间5开始?别忘了已经是按照右边界排序的了。

2024-04-11 22:25:17 930

原创 代码随想录训练营day35

按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。如果按照k来从小到大排序,排完之后,会发现k的排列并不符合条件,身高也不符合条件,两个维度哪一个都没确定下来。此时大家就发现 情况一,情况二,都是固定策略,都不用我们来做分析了,而唯一不确定的其实在情况三。对于本题相信大家困惑的点是先确定k还是先确定h呢,也就是究竟先按h排序呢,还是先按照k排序呢?情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5。

2024-04-11 17:21:11 519

原创 代码随想录训练营day34

如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。所以就取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,candyVec[i]只有取最大的才能既保持对左边candyVec[i - 1]的糖果多,也比右边candyVec[i + 1]的糖果多。

2024-04-10 13:27:26 687

原创 代码随想录训练营day32

相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!从图中可以发现,其实我们需要收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间。如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。

2024-04-09 15:36:55 520

原创 代码随想录训练营day31

贪心算法一般分为如下四步:将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解。

2024-04-09 13:24:01 552

原创 代码随想录训练营day30

代码随想录**总结:**回溯是递归的副产品,只要有递归就会有回溯,所以回溯法也经常和二叉树遍历,深度优先搜索混在一起,因为这两种方式都是用了递归。回溯法就是暴力搜索,并不是什么高效的算法,最多再剪枝一下。回溯算法能解决如下问题:组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集棋盘问题:N皇后,解数独等等。

2024-04-08 19:53:43 251

原创 代码随想录训练营day29

【代码】代码随想录训练营day29。

2024-04-08 11:49:44 876

原创 代码随想录训练营day28

求排列问题的时候,就要从0开始,因为集合是有序的,{1, 2} 和{2, 1}是两个集合,排列问题我们后续的文章就会讲到的。从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集!那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始!(opens new window)的基础上加上了去重,其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。

2024-04-02 14:43:18 614

原创 代码随想录训练营day27

递归用来纵向遍历,for循环用来横向遍历,切割线(就是图中的红线)切割到字符串的结尾位置,说明找到了一个切割方法。此时可以发现,切割问题的回溯搜索的过程和组合问题的回溯搜索的过程是差不多的。注意图中叶子节点的返回条件,因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回!切割问题:切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中再切割第三段…我们来分析一下切割,其实切割问题类似组合问题。

2024-04-01 15:52:37 855

原创 代码随想录训练营day25

图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]。两个字母就两个for循环,三个字符我就三个for循环,以此类推,然后发现代码根本写不出来。输入1 * #按键等等异常情况。

2024-03-30 17:31:29 443

原创 代码随想录训练营day24

什么是回溯法:回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯函数也就是递归函数,指的都是一个函数。回溯法的效率:因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。回溯法解决的问题:回溯法,一般可以解决如下几种问题:组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集。

2024-03-29 13:50:46 681

原创 代码随想录训练营day23

代码随想录代码随想录B站卡哥视频代码随想录B站卡哥视频代码随想录B站卡哥视频。

2024-03-28 20:25:19 355

原创 代码随想录训练营day22

将删除节点(元素7)的左孩子放到删除节点(元素7)的右子树的最左面节点(元素8)的左孩子上,就是把5为根节点的子树移到了8的左孩子的位置。第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。动画中的二叉搜索树中,删除元素7, 那么删除节点(元素7)的左孩子就是5,删除节点(元素7)的右子树的最左面节点是元素8。第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点。

2024-03-27 15:36:31 846

原创 代码随想录训练营day21

其实情况一 和 情况二 代码实现过程都是一样的,也可以说,实现情况一的逻辑,顺便包含了情况二。首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。那么有录友可能疑惑,会不会左子树 遇到q 返回,右子树也遇到q返回,这样并没有找到 q 和p的最近祖先。

2024-03-26 16:01:23 540

原创 代码随想录训练营day20

【代码】代码随想录训练营day20。

2024-03-25 17:26:19 231 1

原创 代码随想录训练营day18

(1)递归法//递归法public:int result;//终止条件if(node->left==NULL&&node->right==NULL)//当遇到叶子节点的时候,就需要统计一下最大的深度了,所以需要遇到叶子节点来更新最大深度return;if(node->left)//左depth++;depth--;//回溯if(node->right)//右depth++;depth--;return;

2024-03-24 10:35:16 843

原创 代码随想录训练营day17

(1)迭代法//迭代法public:if(root!while(!stk.pop();(2)递归法//递归法 后序遍历public://左//右//中return sum;代码随想录B站卡哥视频代码随想录B站卡哥视频代码随想录B站卡哥视频。

2024-03-23 19:57:36 220 1

原创 代码随想录训练营day16

二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)

2024-03-21 13:58:39 256 1

原创 代码随想录训练营day15

(117.填充每个节点的下一个右侧节点指针II)(116.填充每个节点的下一个右侧节点指针)(107.二叉树的层次遍历II)(515.在每个树行中找最大值)(102.二叉树的层序遍历)(637.二叉树的层平均值)(429.N叉树的层序遍历)(104.二叉树的最大深度)(111.二叉树的最小深度)(199.二叉树的右视图)

2024-03-20 22:16:12 319 1

原创 代码随想录训练营day14

(2)确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。(1)确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。(3)确定单层递归的逻辑: 确定每一层递归需要处理的信息。(3)递归法后序遍历。(1)迭代法前序遍历。(2)迭代法后序遍历。

2024-03-19 19:51:17 241

原创 代码随想录训练营day13

文章链接:代码随想录代码随想录B站卡哥视频代码随想录代码随想录。

2024-03-18 14:26:26 315

原创 代码随想录训练营day11

本题犯的错误不是大毛病二是把string类型的字符串和char类型的字符搞混了。(2)采用字符串模拟栈功能。(1)直接用栈当容器。

2024-03-17 20:34:43 299 1

原创 代码随想录训练营10

①两个队列原理:用两个队列que1和que2实现队列的功能,que2其实完全就是一个备份的作用,把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1。②一个队列原理:一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。

2024-03-15 19:22:26 848 1

原创 代码随想录day09

(1)什么是字符串:字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定,接下来我来说一说C/C++中的字符串。在C语言中,把一个字符串存入一个数组时,也把结束符 ‘\0’存入数组,并以此作为该字符串是否结束的标志。在C++中,提供一个string类,string类会提供 size接口,可以用来判断string类字符串是否结束,就不用’\0’来判断是否结束。那么vector< char > 和 string 又有什么区别呢?

2024-03-14 22:39:15 903 1

原创 代码随想录训练营day08

此时第一段和第二段的顺序是我们想要的,但里面的字符位置被我们倒叙,那么此时我们在把 第一段和第二段里面的字符再倒叙一把,这样字符顺序不就正确了。本题中,我们需要将字符串右移n位,字符串相当于分成了两个部分,如果n为2,符串相当于分成了两个部分,如图: (length为字符串长度)其实,思路就是 通过 整体倒叙,把两段子串顺序颠倒,两个段子串里的的字符在倒叙一把,负负得正,这样就不影响子串里面字符的顺序了。然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。

2024-03-14 19:45:37 824 1

原创 代码随想录训练营day07

由于本题目字符串的字母是固定的26个字母组成,因此可以采用哈希数组当容器public:i++)//计算magazine中每个字母的个数j++)//如果ransomNote中出现过该字母就实行减法操作,//最后通过查询arr数组中对应下标的元素值是否是大于等于零,判断出ransomNote能不能由magazine里面的字符构成k

2024-03-13 10:45:05 331

原创 代码随想录训练营day06

注意事项:数组就是简单的哈希表,但是数组的大小可不是无限开辟的。数组这种哈希结构适用于大小有限的,偏向元素连续保存的形式;如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。

2024-03-12 11:58:40 772 1

原创 代码随想录训练营day04

那么相遇时: slow指针走过的节点数为: x + y, fast指针走过的节点数:x + y + n (y + z),n为fast指针在环内走了n圈才遇到slow指针, (y+z)为 一圈内节点的个数A。fast是走两步,slow是走一步,其实相对于slow来说,fast是一个节点一个节点的靠近slow的,所以fast一定可以和slow重合。这就意味着,从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。

2024-03-11 13:39:48 886

原创 代码随想录day03

(2)在原来链表上进行删除。(1)虚拟头节点方法。

2024-03-09 15:00:21 353

原创 代码随想录训练营day02

两个指针起始点一样,快指针进行遍历直到满足所遍历的元素之和大于等于给定值,然后再进行慢指针的向前移动,如果移动之后仍然满足条件就继续移动慢指针,知道不满足条件退出循环,即可得到所寻求的最小子数组长度。由于题目中数组元素是按照大小顺序排列的可以采用做右指针形式,通过对比每次的左右指针所指带元素的绝对值或者平方,然后将大的值放入到新数组的最后,以此进行从两边向中间遍历的方式得到所有元素的平方。(1)暴力列举法,时间复杂度为。(2)双指针法时间复杂度为。(1)暴力解法:时间复杂度。(2)双指针法:时间复杂度。

2024-03-08 13:31:55 551

原创 【代码随想录算法训练营day01】

C++学习-代码随想录day1

2024-03-06 21:39:50 609

空空如也

空空如也

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

TA关注的人

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