自定义博客皮肤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)
  • 收藏
  • 关注

原创 算法训练营day59

这里的初始化第一列为1,表示t是空字符串 在s的子序列中有1种情况。

2024-06-14 22:23:56 152 1

原创 算法训练营day24

可以用二叉树最近公共祖先来做。

2024-06-13 21:47:04 251

原创 算法训练营day58

动态规划,其实和之前最长公共子序列一样,只不过最后就是比较以下dp数组的值是否和字符串s的长度相同。

2024-06-13 15:25:25 245

原创 算法训练营day23补签

在递归里操作,主要就是更新maxcount 然后要把reslut也更新。

2024-06-12 15:53:44 157 1

原创 算法训练题day57

不太一样,如果是连续的那代码就一样了,这里的区别就在于如果两个字符不相等,应该取max(dp[i - 1][j], dp[i][j - 1])这道题其实可以转换成寻找两个数组中不连续的子序列的最大长度,就和上题一样了。其实动态规划和贪心的本质上都是一样的。这道题的子序列是不连续的,所以很。

2024-06-12 11:55:50 154

原创 算法训练营day56

【代码】算法训练营day56。

2024-06-11 22:17:03 216

原创 算法训练营day53

这道题就是在 买卖股票Ⅱ上多了一个手续费而已。

2024-06-11 10:05:56 185

原创 算法训练营day52

【代码】算法训练营day52。

2024-06-10 21:47:27 419 1

原创 算法训练营day51

要搞明白dp数组的含义, dp数组包含两种情况,持有股票,这个可以持有之前的也可以持有今天的;不持有股票,可以是之前就不持有,也可以今天卖出。

2024-06-10 11:47:27 227

原创 算法训练营day50

相比于1来说就是将环形分解成两种情况,考虑首元素 考虑尾元素。

2024-06-08 21:27:09 249

原创 day49

【代码】day49。

2024-06-04 20:38:26 132

原创 算法训练营day48

当时爬楼梯只有 1,2两种情况所以可以用斐波那契数列做,当上楼的阶梯数为n时,可以抽象成完全背包问题,这里题目要求时排列,所以应该是先遍历背包,再遍历物品,这样 可以包含 1、2 和 2、 1。这里主要是物品没想白怎么表示,想的是根据n 把能取到的完全平方数列出来,再进行遍历,但是解法里的遍历就很巧妙。初始化没有想到,递推公式想到了。

2024-06-04 17:10:29 386

原创 算法训练营day46

完全背包和01背包的区别就是是否可以重复使用,在代码上就是 j 的 for 循环从前向后遍历还是从后向前遍历。先物品再背包是组合,先背包再物品是排列。

2024-06-01 17:07:23 239

原创 算法训练营day45

这道题主要的思路是把题目转换成分成两份,然后转换成一个重量为 sum / 2 的背包去装石头,尽可能将背包装的最大,那么最后最小省的石头就是 (sum - dp[j]) - dp[j] 前边是剩下的石头,后边是能装的最大的石头。

2024-05-31 13:59:51 291

原创 算法训练营day44

题目1:二维dp数组求 01 背包。题目2:一维dp数组求背包\。

2024-05-30 22:24:58 185

原创 算法训练营day43

【代码】算法训练营day43。

2024-05-29 19:27:08 330

原创 算法训练营day42

【代码】算法训练营day42。

2024-05-28 15:36:02 276

原创 算法训练营day41

动态规划理论基础(主要就是确定动态规划的几个步骤)

2024-05-27 20:08:39 484

原创 算法训练day39

【代码】算法训练day39。

2024-05-25 19:34:57 224

原创 补签22day

二叉搜索树定义:左孩子小于节点,右孩子大于节点,且左右子树也符合 该规律。真的简单啊,其实整体思路没错,只是乱没想清楚。自己AC过了,确实对递归理解深入了一些。

2024-05-24 23:37:44 131

原创 算法训练营38

这道题其实跟上面那个像,我写的代码是遇到重复的就删除,不过没有AC过。

2024-05-24 15:42:37 111

原创 算法训练营day37

这道题思路确实不难,想明白了就是固定思路,五块就收,十块收了找五块,二十这里注意,可以找 10 + 5 也可以 找 5 + 5 + 5 ,如果能都能找那就返回true, 否则就是false ,我这里用的是数组记录,其实用int 类型计数就可以了,ti。这里根据身高排序,有大到小,然后如果身高一样就 根据 k 由小到大,然后根据k进行插入相应的位置。

2024-05-23 17:08:58 174

原创 算法训练营36

代码随想录上的思路,让加油 - 耗油,如果所有的总和都<0 那肯定跑不完,然后用一个currsum 统计从 0 开始到当前i 的 剩余油之和,如果 < 0 说明 起始位置肯定在为 i + 1,然后currsum 置零,在重复上面操作,最后返回 start 就行。这道题从两边开始算就好,先从左向右只考虑右边小孩比左边小孩大,然后从右向左考虑,最后取两次糖果数组里大的,然后最后求和即可。根据通过情况反复挑战最终AC过了,这里和原来的差别是他的排序是用绝对值排序的,这样的思路会很简单。

2024-05-22 23:16:34 329

原创 算法训练营day35

贪心算法的思路是根据每个元素看能覆盖的大小,然后更新,更新的时候要取大的覆盖,如果能够覆盖最后的元素就返回true。贪心算法思路很简单,就是把每一天的利润都算出来,然后把整的加起来就是结果。

2024-05-22 21:18:35 293 2

原创 算法训练营day34

贪心算法的思路是,如果当前的和为负数的,就舍去这个和然后重新进行sum累加,同时用reslut记录局部最优,就是每次累加判断sum > max 如果大于就更新max。把大的饼干分给胃口最大的。暴力解法会超时,代码如下。

2024-05-22 16:46:10 214 1

原创 day32算法训练营

剪枝:每次sum > target就return 这已经算是剪枝了,但是剪枝不够彻底,因为约束了k个,所以也可以再for循环的条件是进行剪枝, i < = n - (k - path.size() ) + 1。这个去重是要对树层里的相同元素剪枝,树枝里不进行剪枝,剪枝可以通过比下标进行也可以定义一个数组 这里是 如果used[i - 1] = true证明是树枝,这时候可以选取相同的元素,如果used[i - 1]=false 证明是树层,这时候就要 continue剪枝了。

2024-05-19 19:07:56 536

原创 算法训练营day31

这道题主要就是注意 for 循环i从0开始,然后就是需要用used数组存储元素使用情况,然后used和path都要回溯。这里不能对元素进行排序,所以去重需要用一个 set来进行去重。

2024-05-18 20:31:29 104

原创 补签打卡day21

这个我还用最开始的思路,直接记录所有路径,然后把复合的再加入,但是这个相较于代码随想录上的算法,会多for循环去判断,可以直接在递归函数里加入 int sum 然后递减,如果 sum == 0证明找到了路径,就加入到结果里。递归算法的思路就是去找最大深度,然后深度变化之后就进行值得改变,因为顺序是按左右来的所以不用考虑最左边得值到底是深度最大得左子叶还是右子叶。代码随想录里的解法:通过判断叶子节点时sum 是否减到 0 同时,如果递归的时候路径之和== target 就一路返回true.

2024-05-16 21:28:22 306

原创 算法训练营day30

这道题和分割回文串 比较相似,主要是终止条件,通过设置IP的点来进行判断,如果 pointnum == 3 说明已经分割出四个字符串了,就可以终止,前面三个 再for循环里判断了,但是最后一个需要再终止条件里进行判断,我选择用一个数组存储字符串最后再拼合,这个比较麻烦但是感觉相比再字符里直接加点清晰明了一些。不过要注意最后一个字符串加入path 也要进行pop回溯。之后判断是否合法,首先是 begin > end 不对, 头不能是0, 不能有数字以外的非法字符,字符数不能大于255。

2024-05-16 17:02:47 279

原创 算法训练营29day

这道题主要就是注意startindex得值,剪枝是加在for循环里,如果sum + 当前值 <= target 再进行操作,否则剪枝。首先排序,主要就是排序之后相邻相同的元素只第一个进行递归搜索,后面的都不进行递归搜索,这就是去重。这道题目主要还是分割得时候如何弄明白。

2024-05-15 22:53:48 149

原创 算法训练营28day

不过代码随想录上的解法,递归函数里面有一个sum的参数,相当于每次 再push到path的时候就进行了加和,而我是在每次终止条件里添加的。这个操作会让剪枝操作更加简单明了,不过剪枝操作不是那么熟练,以后要复习加深一下。这道题其实最开始的思路还是for循环解法,然后看了看题解,这个是根据index来确定深度,然后for循环是从 i = 0 开始,横向遍历数字对应的字符集合,然后递归相当于纵向遍历输入的号码。这道题其实和昨天的组合很相似,只是多加个是否等于目标值的判断即可。

2024-05-14 15:44:25 175 1

原创 训练营day27

出去玩了几天 ,上午先把 5.6 号的三个题目又做了一遍,对递归有了新的体会,自己写的时候每道题都会有一点小问题,然后看题解,发现就是大体思路有但是会有些注意不到或者没考虑到的,总的来说新的一边真的是会有新的理解。回溯三部曲:确定递归函数参数返回值;回溯法解决的问题:组合;剪枝优化,是在for循环里,对i做限制,即可。回溯搜索法是纯暴力搜索算法;看完视频之后写这个还可以。回溯法一般抽象成N叉书。

2024-05-13 20:49:02 128 1

原创 算法训练营day20

然后看了看代码,首先是对于递归的写法有点理解了,然后就是那个确定左叶子的条件,这里确定左也是是通过父节点确定的,(node->left!= NULL && node->left->left == NULL & node->left->right == NULL)这个讲的递归很详细,这个 明白之后,就是要注意如果左子树是 -1 就是高度差>1 就return -1。平衡二叉树每个节点的左子树和右子树高度差<=1,写的时候明显感觉递归写的很懵逼。我只能说很懵逼,先这样吧,后面再详细的看一看。

2024-05-06 16:59:51 129

原创 算法训练营day19

这里要注意,最小深度是根节点到最近叶子节点(节点没有左右孩子)的最小深度,这里的 注意点主要还是要分出来左子树为NULL 和右子树为NULL 和左右子树都有三种。普通二叉树和满二叉树区别,满二叉树多了一个终止条件,如果左孩子深度和右侧孩子深度一样就是满二叉树,这样可以用 2^n -1 求节点个数。二叉树的深度:节点到根节点的距离,深度从1开始。这里使用迭代法用后序,其实求的是根节点的高度,根节点的高度就是最大深度。这道题我的想法是用层序遍历 去做,最开始报错超出 内存,原因没有pop 队列头。

2024-05-05 20:54:27 143

原创 算法day18

之前的前中后序遍历是通过递归和迭代方式完成的,其中用到的数据结构是栈(递归底层也是栈),同时这几个遍历是深度优先搜索。层序遍历是广度优先搜索,它可以通过队列数据结构实现,其中可以通过一个 size 来记录每层node的个数,然后仅弹出队列的前 size 个元素,将其值加入数组,然后再将左右孩子加入队列,这里如果左右孩子为空就不加入(否则无法满足终止条件,while的终止条件是队列为空)。还是递归方法,这里其实就是递归,感觉递归如果想往深里走很难想明白,就把它当作第一层的对比就好。题目1:二叉树的层序遍历。

2024-05-04 22:30:13 132

原创 训练营day14

前序遍历是,中,右左操作,中操作是将当前节点的val值放入 rel数组,然后将右节点先加入栈中,再将左节点加入栈中。中序遍历是左中右,这里相当于左孩子不为空就一直压入栈中,然后为空了,就pop出栈顶将val放入rel数组,然后赋值cur = 右节点,然会判断右节点是否为空如果为空就回到pop栈顶这一步,否则就继续将左还在节点压入栈中。后序遍历跟前序类似,后序是左右中, 那就可以将前序中的左右入栈调换位置, 中 取,左入栈 右入栈,然后处理的就是 中 右左 ,然后将数组反转就是左右中。

2024-05-01 23:30:59 212 1

原创 训练营day13

代码随想录的解法是自己构建一个单调的队列,让滑动窗口里的最大值保持在队列头,然后pop的时候,如果队列头就是数组里原来的元素,就pop掉这个元素,如果不是证明该滑动窗口再添加元素的时候已经把数组里的元素删掉了(因为要保持最大值,队列里只维护单调递减的数)。这里类就构建完了,然后后面的思路就是先把k个元素放进队列(这里用的是deque 双向队列,和普通的queue不一样),然后开始开始滑动,pop头元素,push新的元素进入队列,然后返回头元素就是最大的值。大顶堆pop的时候是弹出最大的元素,小顶堆相反。

2024-04-29 19:56:53 180

原创 算法训练营day11

这道题也可以用栈,栈存放遍历过的元素,如果当前元素== 栈顶,就pop 最后栈里剩下的就是没有重复的字符,然后一个一个弹出赋值字符串,最后需要反转。然后,看了解法可以用string直接当栈使用, 字符串可以用 push_back() (将字符加到字符串最后)还可以用 .back() (表示字符串末尾字符)pop_back()(弹出字符串最后的字符)empty()(可以判断字符串是否为空) 这里用字符串的话,字符串末尾就相当于栈顶,然后最后不用进行字符反转了就。栈适合做对称匹配问题。

2024-04-27 23:20:29 277

原创 训练营day10

这道题用两个队列实现栈,主要思路就是将队列1里除了最后一个元素全部 push 到队列2 并 pop 这些元素,然后返回最后一个元素即实现了栈里的top ,如果再将这个元素pop掉就实现了 栈的pop操作,不过这里需要注意一点,当完成这些操作之后,需要将队列2再赋值给队列1,然后清空队列2,否则先 pop 再 top就出错了。pop() 出队,将队列头元素删除(出队),无返回值。基本操作:push() 入队,在队尾添加元素,无返回值。基本操作:push() 入栈,在栈顶端添加元素,无返回值。

2024-04-26 16:06:52 269 3

原创 算法训练营day9

这道题自己是有思路的,然后竟然AC过了,很意外。字符串总结:字符串里用到了很多双指针的操作,有些算法还是很巧妙的,目前还没办法说像做题一样对这些东西进行一个分类,例如遇到什么样的题就怎么怎么样,其实我们学习算法也是为了通过一道题,有些题通过暴力方法可能需要很麻烦的思考各种条件,而有了这些算法的直到,我们可以清晰明了的AC。这道题里边用了库函数find,其实自己实现还是很麻烦的,这里我也是参考了移动匹配,就是s+s 得到新的字符串SS,如果SS中还有s证明该字符串是可以由子字符串组成的。

2024-04-25 16:08:28 168 1

空空如也

空空如也

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

TA关注的人

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