自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法训练 day39 | 62.不同路径 63. 不同路径 II

动规五部曲:1、确定dp数组及其下标的含义dp[i][j]: 表示从(0,0)出发,到(i,j)有dp[i][j]条不同的路径2、递推公式想要求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]只有这两个方向过来。3、dp数组初始化。

2024-02-29 11:06:16 295

原创 算法训练 day38 | 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

动规五部曲:1.确定dp数组和下标的含义dp[i]的定义为:第i个数的斐波那契数值是dp[i]2.确定递推公式为什么这是一道非常简单的入门题目呢?因为题目已经把递推公式直接给我们了:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];

2024-02-27 22:43:13 331

原创 算法训练 day36 | 435. 无重叠区间 763.划分字母区间 56. 合并区间

首先需要对区间排序,按照左边界或右边界排序都可以,本文用右边界排序。按照右边界排序后,从左向右记非交叉区域的个数。最后用区间总数减去非交叉区间的个数就是需要移除区间的个数。记录非交叉区间的个数也是有技巧的:区间,1,2,3,4,5,6都按照右边界排好序。当确定区间 1 和 区间2 重叠后,如何确定是否与 区间3 也重贴呢?就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,如果这个最小值也触达到区间3,那么说明 区间 1,2,3都是重合的。

2024-02-26 21:10:40 369

原创 算法训练 day35 | 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

找零只用分三种情况即可需要注意的是情况三,对20找零时应该先判断一个10和一个5的情况,因为5是万能的,先把5用完的话情况二就不能满足了。

2024-02-03 23:38:24 299

原创 算法训练 day33 | 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

思路:先把数组元素按绝对值由大到小排序,排序后进行遍历把负数取反,一定要先排序再取反才能确保先把绝对值大的负数取反。如果数组中负数全部取一次反后还没达到K次。判断剩余次数的奇偶性,若是偶数不用做任何操作了,若为奇数把数组中最小值取一次反即可,最后计算出最大化的数组和。

2024-02-01 16:43:50 180

原创 算法训练 day32 | 122.买卖股票的最佳时机II 55.跳跃游戏 45.跳跃游戏II

如果想到其实最终利润是可以分解的,那么本题就很容易了!其实就是把利润分解为以每天为一个维度,我们可以只收集正利润的区间,获取正利润的区间就是股票买卖的区间,最终只需要总利润,不需知道每个区间。

2024-01-30 22:42:08 273

原创 算法训练day31 | 455.分发饼干 376.摆动序列 53.最大子序和

本题思路是现将饼干和小孩排序,然后用大饼干满足胃口大的小孩并记录满足小孩的数量。一定要先遍历胃口再遍历饼干,外面的 for 是里的下标 i 是固定移动的,而 if 里面的下标 index 是符合条件才移动的。如果 for 控制的是饼干, if 控制胃口,就是出现如下情况 :if 里的 index 指向 胃口大的, for 里的 i 指向饼干比胃口小,因为饼干满足不了胃口,所以 i 持续向前移动,而 index 走不到的逻辑,所以 index 不会移动,那么当 i 持续向前移动,最后所有的饼干都匹配不上。

2024-01-28 23:49:00 364

原创 算法训练 day29 | 491.递增子序列 46.全排列 47.全排列 II

首先这是要去树上的节点,就不必要递归截止条件了,只要单个数组中元素个数大于1即可。本题采用set去重,遍历时先判断该元素是否在set中出现过,若set中有则跳过该元素。

2024-01-26 01:13:27 188

原创 算法训练 day28 | 93.复原IP地址 78.子集 90.子集II

1、确定递归函数返回值和参数声明一个全局变量(字符串数组),保存满足条件的字符串作为结果。分割和加 ' . ' 时直接对原字符串进行处理,函数传入字符串 s 、遍历的起始位置 idx 、记录 ' . ' 个数的变量 cnt。2、确定终止条件当cnt等于三的时候,还要判断截取的子串是否满足IP地址的条件(需另写一个函数判断),当这两个条件都成立时,将处理好的字符串放入结果集里。3、确定单层搜索逻辑。

2024-01-23 13:58:47 335

原创 算法训练 day27 | 39. 组合总和 40.组合总和II 131.分割回文串

本题集合中有重复数字,但找出的组合不允许有重复,先对集合排序,相同值的元素肯定是相邻的,它们中任意一个元素与其他元素的组合种类都是一样的,所以当遍历到重复元素时,只留下第一个元素,后面重复的跳过去,这样就做到去重了。但是在纵向便利的时候,虽然元素的值相等,但元素不同,也是要遍历到的。纵向遍历时,用一个bool型的used数组记录使用过的元素为true,回溯时就变回了false,当进行横向遍历时,为false的元素就是重复的元素,应跳过。遍历到字符串最后面,说明找到一种切割方法,结束本层递归。

2024-01-22 15:14:15 388

原创 算法训练 day25 | 216.组合总和III 17.电话号码的字母组合

本题和77.组合其实是差不多的,只是增加了求和的过程。对于剪枝,也要多加一步判断,当所求得和大于规定的和时应该舍去。其他部分两道题大差不差。

2024-01-20 13:54:52 370

原创 算法训练 day24 | 77. 组合

对于本题,我们需要用一个数组保存单个满足条件的组合,还需要另一个结果数组放满足条件组合的集合,可以把他们定义为全局变量,那么递归函数就不需要返回值了。本题还可以用剪枝优化一下,如:对于n=4,k=4的情况,在第一层for循环的时候从元素2往后的遍历都没有意义了,因为后面没有足够的元素构成有k个元素的组合了。回溯法搜索的过程就是一个树形结构的遍历过程,for循环是横向遍历,递归的过程是纵向遍历的。当遍历到所要得的组合,就该回溯,撤销本次处理的结果,向其他处遍历。3、确定单层搜索逻辑。

2024-01-19 15:09:43 491

原创 算法训练 day23 | 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

1、确定递归函数的返回值和参数返回修剪的节点,让上一层递归接住,传入的参数是根节点和修剪的范围。2、确定终止条件修剪的操作不是在终止条件上进行的,所以遇到空节点返回就可以了。3、确定单层递归逻辑采取中序遍历,如果当前节点的值小于low,那么应该递归右子树,并返回该右子树头结点的值让上一层递归接住,相应的左子树就被删除了。如果当前节点的值大于high,那么应该递归左子树,并返回该左子树头结点的值让上一层递归接住,相应的右子树就被删除了(上述的递归是中序遍历的递归中的递归)。

2024-01-18 14:48:23 394 1

原创 算法训练 day21 | 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

很关键一点是当我们从上向下遍历,第一次遇到节点的值在p和q之间时,那么该节点就是它们的最近公共祖先。1、确定递归函数的返回值和参数返回值是最近公共祖先,传入参数是当前节点、q、p节点;2、确定终止条件遇到空则返回;3、确定单层递归逻辑当前节点值大于p和q的值向左遍历,当前节点值小于p和q的值则向右遍历,剩下的情况就满足最近公共祖先的条件了,直接返回当前节点;

2024-01-17 14:44:55 386

原创 算法训练 day21 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

题目链接:这是一棵二叉搜索树,中序遍历就是有序地,最直观的想法就是把该树转换成有序数组,然后再找数组中的最小差值。但是这样增加了空间复杂度,其实我们可以在遍历过程中就能找到最小绝对差。我们需要用一个pre节点记录当前遍历到的节点cur的前一个节点,中序遍历,每个节点的值是递增的,在此过程中我们就可以边遍历边比较cur与pre的差值。

2024-01-16 15:26:31 354 1

原创 算法训练 day20 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

654.最大二叉树构造二叉树一般采用前序遍历,因为要先构造中间节点,然后递归构造左子树和右子树。1、确定递归函数返回值和参数传入的是存放元素的数组,返回的是构造的二叉树的头结点;2、确定递归终止条件题目中说了数组的大小大于零,那么当递归的时候,传入的数组大小为1时,说明遍历到叶子节点;3、确定单层递归逻辑先找到数组中最大值作为新构造二叉树头结点,以最大值为界,数组中最大值左边元素用于递归构造左子树,右边元素递归构造右子树。优化后。

2024-01-15 16:19:07 373 1

原创 算法训练 day18 | 513.找树左下角的值 112. 路径总和 105.从前序与中序遍历序列构造二叉树

本题用迭代法,可以层序遍历记录每一层第一个值,每往下一层更新该值,直到遍历到最后一层。属于层序遍历的模版题。对于递归,则稍难。1、确定递归函数的参数和返回值传入的参数是节点,还要有一个变量depth记录最长深度。不需要返回值,但需要两个全局变量,dep记录最大深度,ret记录最大深度最左节点的数值。2、确定递归函数的终止条件如果该节点是叶子节点,更新最大深度。3、确定单层递归的逻辑分别往左和往右递归,其中要回溯。int迭代法112. 路径总和。

2024-01-14 12:16:31 376 1

原创 算法训练 day17 | 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

平衡二叉树是每个节点的左右两个子树的高度差的绝对值不超过1,既然要求高度,就要想到用后序遍历。1、确定递归函数的返回值和参数返回值是当前传入节点到根节点的高度,参数是传入的节点。2、终止条件递归到空节点,返回0.3、明确单层递归逻辑分别求出左右子数的高度,判断差值,如果小于等于1,返回高度,否则返回-1,表示该树已经不是平衡二叉树了。用-1来标记不是平衡二叉树。

2024-01-12 18:48:22 394 1

原创 算法训练 day16 | 104.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

对于此题首先得弄清二叉树的深度和高度的区别,才能弄清解决这道题的本质。深度是任意一节点到根节点的距离,高度是任意一节点到叶子节点的距离。弄清楚高度和深度,就方便选择正确的遍历方式。对于高度应该是从二叉树的下面从上面开始计算,所以采用后序遍历方式较为方便,而深度是从上往下计算的,应该用前序遍历。而对于本题,所求的是最大深度,那么高度和深度是相等的。1、确定函数参数和返回值:参数是传入根节点,返回值是最大深度,即为int2、确定终止条件:空节点,返回0。

2024-01-11 13:30:43 353 1

原创 算法训练 day15 | 102.二叉树的层序遍历 226.翻转二叉树 101.对称二叉树

层序遍历,就是一层一层的遍历二叉树,此时需要就用队列来完成。队列是先进先出的适合一层一层遍历。首先把头结点放入队列中,用一个size记录队列的大小,同时也表示了每一层元素的个数。遍历某一层时,先把这一层的节点从队列中弹出并把这些节点对应的值放入一个数组中,弹出节点的个数取决于size的大小,再把下一层的节点放到队列中。如此下去,直到队列为空。

2024-01-10 17:43:39 331

原创 算法训练 day14 | 递归遍历二叉树 迭代遍历二叉树

总结递归三要素,每次递归都要按照三要素来写1、确定哪些参数是递归的过程中需要处理的,那么就在递归的函数里加上这个参数,并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。2、写完了递归算法,运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果没有终止,操作系统的内存栈必然就会溢出。3、确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。学会自己定义一个二叉树。

2024-01-09 15:54:26 352

原创 算法训练 day13 | 239. 滑动窗口最大值 347.前 K 个高频元素

题目链接:滑动窗口最大值视频讲解:单调队列正式登场! 对于此题我们要自己实现一个单调队列,对头为最大值。那么怎么设计呢?主要是对于队列的push和pop合理设计,即能实现它的单调性。其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。所以单调队列不仅仅是对窗口里的值进行排序。pop和push的规则:1、push:如果push的元素大于队尾的元素,那么就将队尾元素弹出,直到push的元素小于等于队尾的元素为止;2、pop:如

2024-01-08 16:42:41 349 1

原创 算法训练 day11 | 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值

栈的特殊结构,非常适合做对称匹配类的题目。首先要弄清楚有几种不匹配的情况。其实总共就三种:1、“( [ { } ] ( )” 左边括号多余;2、“( [ { ] ] )” 括号类型不匹配;3、“( [ { } ] ) ) )” 右边括号多余;弄清楚这几种情况,那么怎么有效的运用栈呢?因为存在左括号就要有个有括号跟它匹配,在遍历字符串的时候,碰到左括号我们就可以往栈里放一个右括号,这样在字符串中寻找右括号时可以直接与栈中元素进行比较,不用过多的操作。

2024-01-06 17:32:16 395 1

原创 算法训练 day10 | 232.用栈实现队列 225. 用队列实现栈

主要考察的是对栈和队列的熟练程度。

2024-01-05 15:02:20 352 1

原创 算法训练 day09 | 28. 找出字符串中第一个匹配项的下标 459.重复的子字符串

KMP的主要思想上是主要是把next数组弄清楚,通过此题初学KMP,浅浅总结一下。next数组有很多表示方式,做本题用的是原始的next数组(不做后移或者-1的操作)。那么遍历到数组的某个地方发现两元素不一样,需要做回退操作时就要找到该元素对应next数组的前一个值,才是要回退到的位置。初始化时定义的两个指针i和j,i表示指向后缀末尾的位置,j表示指向前缀末尾的位置。

2024-01-04 18:21:31 360 1

原创 训练营 day08 | 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字 151.翻转字符串里的单词 卡码网:55.右旋字符串

1、重温了反转字符串;2、移除元素,双指针很好用;3、本题移除元素后要更新字符串的大小;

2024-01-03 15:36:08 1145 1

原创 算法训练 day07 | 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

为了减少时间复杂度,四个数组可以分两部分遍历。1、先定义一个unordered_map2、在A、B、C、D四个数组中先遍历A、B数组,求A、B两个中元素的和a + b。用map的key存和a + b,value存两数之和出现的次数;3、定义一个count,记录满足a + b + c + d =0的次数;4、一起遍历C、D数组,求和c + d,从map中找到满足0 - (c + d)的key,读取key对应的value即是满足条件的个数,把它加到count中;5、最后返回统计值count即可;

2024-01-02 16:46:03 1183

原创 算法训练 day06 | 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

1、数组的下标和所保存的元素是意义对应的关系,有时可以反过来考虑一下,让下标表示我们所想要的值,用其对应的元素来计数。2、26个字母对应的ASCII码是连续的,用任意一个字母减去 'a' 可以得到该字母在0-26的位置,返回的是ASCII值。

2024-01-01 16:55:52 822

原创 算法训练 day04 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

1、引入虚拟头结点方便操作真实的头结点;2、在节点交换过程中,节点会改变,如果之后需要用到该节点,则需要先把该节点保存入一个临时变量;3、确定好while循环的终止条件,链表长度为偶数,cur指针会遍历到最后一个节点,终止条件是cur->next = nullptr;若为奇数,cur会遍历到倒数第二节点,终止条件为cur->next->next = nullptr;且while中cur->next!= nullptr的顺序不能颠倒,如果写成 cur->next->next!

2023-12-30 20:38:41 1830 1

原创 算法训练 day03 | 203.移除链表元素 707.设计链表 206.反转链表

此题就是熟悉链表的操作,主要学会了使用的方法,方便对链表进行增、删。C++是有默认的构造函数的,但用默认构造函数初始化时,不能直接给变量赋值。直接使用原来链表操作,需要把头结点单独考虑,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。若要移除头结点,只需把头结点向后移动一位即可,不过C++移动后要自己删除。把head赋给一个临时指针,在进行移位,最后删除临时指针。如果不创建临时指针,head移位后指向的位置变了,不能找到原来的头结点。

2023-12-29 18:24:12 375

原创 算法训练day 02 | 977.有序数组的平方、209.长度最小的子数组、 59.螺旋矩阵II

此题采用一前一后的双指针,由于存在负数平方后最大的数肯定在数组两边,用前后双指针取值,i 指向数组起始位置,j 指向数组终止位置,判断两个位置平方后的值,大的放入新的数组中。这题是升序排列,要从后往前在数组中放值。while语句判断要加上 i = j 的情况,保证取到中间的数。做题出现的错误:声明一个vecoter容器只是默认初始化vector v;此时是个空容器,不能直接通过索引的方式对指定位置的元素进行赋值。应该指定值初始化:vector v(nums.size(), 0)

2023-12-28 15:37:54 380

原创 算法训练day 01| 704. 二分查找、27. 移除元素

使用二分法的前提条件:数组为有序数组,且数组中无重复元素。二分法主要是先定义好区间,一般分为两种,即[left,right]即[left,right)注意当nums[middle] > target时middle要减1。这种情况,当nums[middle] > target时因为是右开,可以直接right = middle,同时right初始化时直接去数组的大小。

2023-12-27 14:57:57 373 1

空空如也

空空如也

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

TA关注的人

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