- 博客(26)
- 收藏
- 关注
原创 代码随想录算法训练营第31天 | 56.合并区间、738.单调递增的数字
对于贪心算法,没有什么套路和框架,需要多练习常规解法,这样遇到类似题目时能够有思路。本题中的 flag 用来标定赋值9从哪里开始,设置为默认值,为了防止在 flag 没有被赋值的情况下执行第二个 for 循环。
2024-08-30 10:32:05
386
原创 代码随想录算法训练营第30天 | 452.用最少数量的箭引爆气球、435.无重叠区间、763.划分字母区间
本题思路比较简单直接,就是重复的气球一起被射爆。寻找重复的气球和寻找重叠的气球的最小右边界需要一定的技巧。本题和上一题很像,弓箭的数量就相当于是非交叉区间的数量,只要把上题代码里射爆气球的判断条件加个等号,然后用总区间数减去弓箭数量就是要移除的区间数量了。本题每个字母的最远位置,就划定了一个区间。但要取这些区间的“并”,这样才能满足覆盖所有字母的要求。即,右边界更新为较大值。
2024-08-29 10:50:58
319
原创 代码随想录算法训练营第29天 | 134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列
上面的解法可能不容易想到,思路和最大子序和那题有些相似。本题还可以使用暴力解法,遍历每一个加油站为起点的情况,模拟汽车行驶一圈的过程。一次是从左到右遍历,只比较右边孩子的评分比左边大的情况另一次是从右到左遍历,只比较左边孩子的评分比右边大的情况本题注意分析里面的逻辑,遇到没有思路的题目时,可以试着将所有可能出现的情况分析一下。关于出现两个维度一起考虑的情况,其技巧都是确定一边然后贪心另一边,两边一起考虑,就会顾此失彼。
2024-08-28 10:55:33
990
原创 代码随想录算法训练营第28天 | 122.买卖股票的最佳时机Ⅱ、55.跳跃游戏、45.跳跃游戏Ⅱ、1005.K次取反后最大化的数组和
本题主要是将整体利润拆分成每天的利润。不要拘泥于每次跳跃几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点,覆盖范围内最小步数一定可以跳到任意位置,不需要考虑具体怎么跳的。这题还是很容易想到的,优先将负数变为它的绝对值,如果k没有用完,接着考虑变换数值小的数。
2024-08-27 10:59:04
404
原创 代码随想录算法训练营第27天 | 455.分发饼干、376.摆动序列、53.最大子序和
贪心算法一般没有什么规律。本题还有另一种思路:尺寸小的饼干先喂饱胃口小的孩子,也可以解决问题。想要保持区间的波动,只需要删除单调区间上的元素即可,若是求区间长度,那么都不需要删除元素,只统计长度即可。本题还可以用动态规划解法,等后面复习到会涉及。
2024-08-26 15:20:23
533
原创 代码随想录算法训练营第25天 | 491.递增子序列、46.全排列、47.全排列Ⅱ
在单层递归时,uset 的作用是记录本层元素是否重复使用,新的一层都会重新定义 uset,uset 只负责递归过程中本层的逻辑。每层都是从0开始搜索,而不是从 startIndex 开始需要 used 数组记录 path 中都存放了哪些元素还是使用之前涉及到的去重方法。
2024-08-25 15:43:30
439
原创 代码随想录算法训练营第24天 | 93.复原IP地址、78.子集、90.子集Ⅱ
本题将分割字符串的点覆盖,并且增加了操作字符串添加 " . " 作为分隔符,并验证区间的合法性,比较综合。这题比较简单,基本是直接套用回溯的模板结构。若本题是求全排列,则每次要从0开始遍历,为了跳过已入递归栈元素,需要使用 used 数组。
2024-08-23 14:46:56
413
原创 代码随想录算法训练营第23天 | 39.组合总和、40.组合总和Ⅱ、131.分割回文串
对于组合问题,什么时候需要使用 startIndex?如果是在一个集合中求元素组合,需要 startIndex,若是在多个集合中求元素组合,各个集合之间相互不影响,那么就不需要 startIndex。理解数层去重和树枝去重这两个维度。本题将切割问题抽象为了组合问题。
2024-08-22 16:47:26
369
原创 代码随想录算法训练营第22天 | 77.组合、216.组合总和Ⅲ、17.电话号码的字母组合
将回溯法的搜索过程抽象为树形结构,可以直观地看出搜索的过程,用回溯的三部曲,可以逐步分析函数的参数、终止条件和单层搜索的逻辑。在处理过程中有sum 加法操作,回溯过程就需要有减法操作,一一对应。注意:输入1 * #按键等等异常情况,在代码中可以加入对于这些异常情况的处理。
2024-08-21 13:30:37
931
原创 代码随想录算法训练营第21天 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
本题还可以用迭代法来解决,剪枝操作分为三步:1.将 root 移动到 [low,high] 范围内,2.剪枝左子树,3.剪枝右子树。定义的区间为左闭右闭,在调用 traversal 函数时传入的 left 和 right 是 0 和 nums.size()-1。注意右中左遍历二叉树,中节点的处理逻辑就是让 cur 的数值加上前一个节点的数值。
2024-08-20 14:27:45
386
原创 代码随想录算法训练营第20天 | 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
注意利用二叉搜索树的有序性。本题比较简单,根据插入元素数值决定递归方向。注意上面可能的情况以及处理。
2024-08-19 21:44:12
430
原创 代码随想录算法训练营第18天 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
将二叉搜索树转化为有序数组,遍历数组,按题目要求解题。对于普通二叉树中的众数,可以使用 map 统计元素出现的频率并排序,取前面高频的元素的集合。1.求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。2.在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。
2024-08-19 21:07:39
444
原创 代码随想录算法训练营第17天 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下标索引直接在原数组上操作,这样可以节约时间和空间上的开销。将 root1这棵树重复利用,root1 就是合并之后树的根节点基于二叉搜索树的有序性,遍历的时候会比普通二叉树简单些。将二叉树转变为线性序列来判断其是否为二叉搜索树。
2024-08-16 20:26:14
393
原创 代码随想录算法训练营第16天 | 513.找树左下角的值、112.路径总和、113.路径总和Ⅱ、106.使用中序与后序遍历序列构造二叉树、105.使用前序遍历和中序遍历序列构造二叉树
本题的两种解法总结了之前所学的知识,递归里面包含回溯的过程以及层序遍历。终止条件时将计数器设置为目标值,每次减去遍历路径节点上的数值能够简化代码多一个记录路径的操作,并且将所有符合条件的路径都放到一个容器中注意在切割过程中,坚持循环不变量原则,明确切割的标准,左闭右开还是左开右闭。
2024-08-15 22:19:56
853
原创 代码随想录算法训练营第15天 | 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数
当我们既需要求二叉树的高度,又需要返回一个结果(确定他处于某种状况),如是不是平衡二叉树,就可以多返回一个定值,如-1,通过这个值就可以做到两者同时判断。注意使用两个数组,一个记录路径,另一个为最终结果;另外,还要注意将回溯写入递归里,能够将每次存到值减少,从而得到所有路径。平时解二叉树的题目时,已经习惯了通过节点的左右孩子判断本节点的属性,而本题我们要通过节点的父节点判断本节点的属性,需要注意。遍历顺序是左右中,后序遍历。
2024-08-14 21:15:14
725
原创 代码随想录算法训练营第14天 | 226.翻转二叉树、101.对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度
本题使用前序遍历和后序遍历也都可以,但中序遍历不方便,中序遍历会将某些节点的左右孩子反转两次。本题也可以使用递归来解决,遍历顺序只能是后序遍历,因为要遍历两棵树,且要比较内外侧节点是否相等,一棵树的遍历顺序是左->右->中,另一棵是右->左->中。本题递归法是要通过递归函数的返回值计算树的高度,使用后序遍历。本题需要注意的是和上一题的区别,最小深度和最大深度的定义。
2024-08-13 14:47:08
486
原创 代码随想录算法训练营第13天 | 二叉树的递归遍历、102.二叉树的层序遍历
二叉树的三种遍历也可以用迭代法来实现,但相对于递归而言,迭代对于前序遍历和中序遍历,在前序遍历时访问节点(遍历节点)和处理节点(将元素放进result数组中)可以做到同步处理,但是中序就无法做到同步,这就没有递归法方便,也没有做到代码统一。层序用队列可以比较好的模拟出一层一层的效果。
2024-08-12 10:22:58
493
原创 代码随想录算法训练营第10天 | 232.用栈实现队列、225.用队列实现栈、20.有效的括号、1047.删除字符串中的所有相邻重复项
代码中 peek() 的实现直接复用了 pop(),注意要掌握复用,将功能相近的函数抽象出来,提高工作效率。这两题注意栈和队列的区别,栈是先进后出,进栈和出栈都是在栈顶进行的,无法对栈底直接进行操作;队列是先进先出,队尾入队,队头出队,即两边都可操作。这种题需要多做多练,整理出不匹配的情况。最后的元素储存在栈中,注意出栈顺序,需要对字符串做反转处理。
2024-08-09 15:42:47
273
原创 代码随想录算法训练营第9天 | 151.翻转字符串里的单词、卡码网55.右旋转字符串、28.实现strStr()、459.重复的子字符串
这道题考察了字符串的多项操作,对于反转字符串,应当要想到使用双指针,本题还多了对于多余空格的删除操作。还有在反转单个单词时可以定义一个 entry 记录是否到达了该要反转单词的区间。将一个数组转成 set,另一个数组用来遍历,将交集元素存入新 set。KMP算法:首先构造next数组,用来回退。接着遍历文本串,遇到不符合的就回退 j (前缀长度)到相应的位置,符合就 j++,若 j 的值已经达到字符串的长度,就说明验证完毕。
2024-08-08 15:53:00
258
原创 代码随想录算法训练营第8天 | 344.反转字符串、541.反转字符串Ⅱ、卡码网54.替换数字
本题和反转链表的思路相同,字符串的反转要比链表简单,字符串也是一种数组,元素在内存中是连续分布的。按照题目描述来,走2k的时候翻转前k个。在进入循环时就要判断字符串长度是否满足2k。对于数组填充的一类问题,做法都是预先给数组扩容至填充后的大小,再从后往前进行操作。
2024-08-07 10:11:58
438
原创 代码随想录算法训练营第7天 | 454.四数相加Ⅱ、383.赎金信、15.三数之和、18.四数之和
本题不需要考虑有重复的四个元素相加等于0的情况,只需要找到四个数等于0即可。本题也可以使用 map,但是 map 空间消耗比较大,数组会更加的简单高效。注意几个剪枝操作:在 for 循环遍历时,若前面已经遍历的元素就跳过;排序之后若数组第一个元素已经大于0,那么可以直接返回结果,因为无论如何也不可能组成三元组。三数之和和四数之和的关键都在于剪枝和去重的操作。
2024-08-06 15:34:31
550
原创 代码随想录算法训练营第6天 | 242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和
暴力解法两层 for 循环还要记录元素出现的次数复杂度过高,用哈希表,且对 s[i]-‘a’ 所在的元素做处理的操作会大大简化复杂度。将一个数组转成 set,另一个数组用来遍历,将交集元素存入新 set。注意求和的过程,还有取数值上各个位数的操作。当需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,要第一时间想到哈希法。本题需要一个集合来存放遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。
2024-08-05 16:41:35
364
原创 代码随想录算法训练营第4天 | 24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交 、142.环形链表II
两两交换链表中的节点:注意1、两个节点的交换 2、每次循环遍历两个节点注意指针的指向是第N个节点的前一个节点。注意,交点不是数值相等,而是指针相等。理解链表中对环的判断以及找到环的入口。
2024-08-03 14:25:19
404
原创 代码随想录算法训练营第3天 | 203.移除链表元素、707.设计链表、206.反转链表
给链表添加虚拟头节点并将其设为新的头节点,此时删除旧头节点的方式便和删除链表中的其它节点方式一样,可以很好的简化链表问题。注意内存的释放判断 index 的范围采用虚拟头节点两种方法逻辑相同,主要还是对 cur 和 pre 指针的操作。
2024-08-02 13:44:47
381
原创 代码随想录算法训练营第2天 | 209.长度最小的子数组、59.螺旋矩阵Ⅱ
滑动窗口的关键在于:何时扩大窗口和何时缩小窗口,根据当前子数组和的大小,不断调节子数组的起始位置。从左到右填充上行从上到下填充右行从右到左填充下行从下到上填充左行从外向内一圈一圈画,注意区间开闭情况。
2024-08-01 14:38:51
460
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人