- 博客(25)
- 收藏
- 关注
原创 代码随想录算法训练营第31天(贪心end)|56.合并区间、738.单调递增的数字
该题从后向前遍历,将字符串转为char[]数组,当遇到不是单调递增的情况,记录下当前需要变更为9的位置,并且前一个数-1,最后根据当前记录的变9的索引位置,将后面的所有值变为9,然后转成int[][]数组即可。合并区间解题思路为,将区间按左边界进行排序,然后统计重叠区间的最大右边界,每次比较当前左边界与前一个重叠区间的最大右边界进行比较,然后更新最大右边界或添加当前的重叠区间。
2025-04-03 11:23:03
151
原创 代码随想录算法训练营第30天(贪心4)|452.用最少数量的箭引爆气球、435.无重叠区间、763.划分字母区间
重叠区间的问题,最直观的思路就是对区间进行排序(区间左边界或右边界都可,这里是对左边界排序),排序后,查找当前重叠区间的最小右边界(即最小交集区间的右边界),如果下一个区间的左边界<=当前最小右边界,说明下一个区间也是重合区间,若下一个区间的左边界>当前最小右边界,说明下一个区间不是重合区间,需要更新新的重合区间的最小右边界,寻找新的重合区间。然后每找到新的重合区间,需要的箭数+1(初始为1),遍历所有区间后,返回箭数即可。
2025-04-02 21:03:06
394
原创 代码随想录算法训练营第29天|134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列
该题题意不是很清晰, 题目隐藏条件,例如[1,3,2,2,1],糖果数为[1,2,1,2,1],共计7个,为什么评分为3的孩子,糖果数只有2, 因为评分3的孩子糖果数为2高于左右两边(都为1),满足相邻两个孩子评分高糖果多的要求,若例题改为[1,3,2,1,2],那么糖果数应该为[1,3,2,1,2],当评分为3的孩子糖果数为2,它右边的评分为2的孩子比再右边评分为1的孩子高,因此评分为2的孩子糖果数为2而评分3的孩子糖果数要多于2的,因此评分3的孩子糖果数要+1,就变成了3。最后累计糖果数即可。
2025-04-02 17:23:58
386
原创 代码随想录算法训练营第28天|122.买卖股票最佳时机Ⅱ、55.跳跃游戏、45.跳跃游戏Ⅱ、1005.k次取反后最大化的数组和
局部最优推出全局最优,找不出反例,试试贪心!
2025-03-31 14:35:36
443
原创 代码随想录算法训练营第27天|455.分发饼干、376.摆动序列、53.最大子数组和
摆动序列就是只有波峰和波谷,没有上下坡的过程,因此只要看当前差值和前一个差值是否符号相反,若相反则说明是一段摆动序列,count++,同时更新prediff=curdiff,若不是,则保持prediff不变,继续寻找curdiff,直到找到符号相反,遍历整个程序后,完成。属于是贪心简单题,升序排序胃口和饼干后,倒序遍历每个孩子的胃口,然后查看当前最大饼干能否满足当前孩子胃口,若不能则遍历下一个孩子,若能就将饼干分配过去,然后都--,遍历完就能得到结果。该题有三种情况需要考虑,1. 上下坡的过程出现平坡;
2025-03-31 14:17:34
286
原创 代码随想录算法训练营第25天| 491.递增子序列、46.全排列、47.全排列Ⅱ
回溯是递归的副产品,只要有递归就会有回溯,所以回溯法也经常和二叉树遍历,深度优先搜索混在一起,因为这两种方式都是用了递归。回溯法就是暴力搜索,并不是什么高效的算法,最多再剪枝一下。组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集棋盘问题:N皇后,解数独等等回溯的模板public void backtracking(参数) {
2025-03-27 22:28:53
365
原创 代码随想录算法训练营第24天|93.复原IP地址 、78.子集 、90.子集II
该题的分割方式与”131.分割回文子串“题类似,首先确参数类型,采用StringBuilder来对字符串进行插入(insert )和删除(deletCharAt)操作,由于该题明确了分割的段数,因此添加额外参数pointsum作为记录分割段数的参数,也用于判断终止条件,当pointsum==3时,说明当前已经分为四段,每个"."前面的子串都会在单层递归中进行检验,因此在终止条件里是对最后一段子串进行检验。LeetCode 90.子集Ⅱ。
2025-03-27 20:50:41
263
原创 代码随想录算法训练营第23天|39.组合总和、40.组合总和Ⅱ、131.分割回文串
该题第一个难点在于,不知道如何分割,与组合问题类似,startIdx就可以作为子串的分割线,以"aab"为例,大循环就相当于遍历"a"、"aa"、"aab"子串,而递归过程就是在遍历"a"时,往下对"ab"进行深入分割"a"、"b"或"ab",在大循环中,只要某一个子串不是回文子串,如"ab",就会直接跳过,进入下一个大循环中,只有所有子串都是回文子串,同时startIdx来到字符串的结尾处,当前结果可以添加到res中,否则继续循环。
2025-03-25 21:21:00
453
原创 代码随想录算法训练营第22天|77.组合、216.组合总和Ⅲ、17.电话号码的字母组合
然后不停的遍历和回溯,将符合要求的结果存下,最后return即可。与组合基本类似,就是多了限制条件,且元素只有1-9,回溯的参数(startidx和sum),startidx是用于下一次回溯搜索时,从下一个数搜索,sum可有可无,可以定义全局变量,终止条件两个,当path.size() == k && sum == n,添加该path,否则跳过,然后return;首先明确组合与排列的区别,组合不关心元素的顺序,而排列关心,如[1,2],[2,1]对于组合来说是同一个结果,而对于排列来说就是两个不同的结果。
2025-03-22 15:39:12
228
原创 代码随想录算法训练营第21天|
该题较难,当找到不符合区间的节点时,虽然要移除该节点,但该节点的左右子树仍然可能存在满足区间范围的节点(当前节点<low,则右子树可能存在;当前节点>max,则左子树可能存在),而左右子树也不是所有节点都满足区间,因此还需要去递归搜索遍历完整,当遇到叶子节点不满足时会直接返回null给叶子节点的根节点,相当于删除了该节点,而中间节点的删除就需要调整其他节点,让被删除的节点剩余符合的节点连接到根节点处。该题与之前做的构造二叉树的题类似,且简单许多,只需要每次不断将有序数组从中间分割,然后构造树即可。
2025-03-18 15:22:31
328
原创 代码随想录算法训练营第20天| 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作 、450.删除二叉搜索树中的节点
比较难的逻辑就是第5种,在找到待删除节点后,先记录待删除节点的右子节点,然后往右子节点的左边一直遍历到叶子节点,然后将待删除节点的左子树“对接到”遍历的叶子节点处,此时再将待删除节点的右子节点直接返回,被待删除节点的根节点直接指向,这样就删除了待删除节点,同时也调整了树的结构,完成删除操作,其他情况就比较简单,按照递归逻辑实现即可。
2025-03-17 20:23:27
401
原创 代码随想录算法训练营第18天| 530.二叉搜索树的最小绝对差、 501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
该题的解题思想比较难,首先找最近公共祖先,就需要采取自底向上遍历的方式,即后序遍历,同时需要清楚返回值和参数情况,返回值需要返回公共祖先节点,参数就是当前root和pq,终止条件为root为空或root==p 或root==q说明找到p,q,直接返回,单层迭代对中间节点的处理逻辑,如果left和right都不为空,说明此时root就是最近公共节点,如果left为空,right不为空,就返回right,说明目标节点是通过right返回的,反之亦然。
2025-03-17 11:00:47
440
原创 代码随想录算法训练营第17天|645.最大二叉树、617合并二叉树、700.二叉搜索树中的搜索、98.验证二叉树
该题需要同时操作两颗二叉树,即同时传入两棵二叉树相同位置的节点(无论是否为空节点),当发现有其中一棵树剩下节点为空时,那么直接返回另一棵树剩下的节点(即当前遍历到的子节点,root1为空,直接返回root2),若都不为空,则俩树值相加,然后构造一颗新树(我这里直接在root1树上覆盖原值),再进行递归,同时遍历两颗树的左子树和右子树,最后返回根节点即可。单层迭代为根据二叉树左右子树的性质,如果当前值<root.val,往左子树搜索,如果当前值>root.val,往右子树搜索,最后返回result即可。
2025-03-16 14:54:01
436
原创 代码随想录算法训练营第16天|LeetCode 513.找树左下角的值、LeetCode 112.路径总和、LeetCode 106.从中序与后序遍历序列构造二叉树等
513. 找树左下角的值 - 力扣(LeetCode)感悟层序遍历到树的最后一层时,首个节点一定是树的最后一层的左节点(题目保证最后一层不会只有右节点),因此,只需要不断按层遍历,给result赋队列第一个节点值,当到最后一层时一定会赋到左节点的值,此时就是需要的结果值。112. 路径总和 - 力扣(LeetCode)感悟该题首先要确定递归的三要素,参数为节点和计数器count(用目标值减去节点值反向计算),终止条件为到达叶子节点,同时判断count的值,=0返回true,否则返回fal
2025-03-14 21:26:54
680
原创 代码随想录算法训练营第15天|110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和 、222.完全二叉树的节点个数
迭代过程:计算左子树的高度,然后判断左子树是否平衡,不平衡直接返回,计算右子树的高度,然后判断右子树是否平衡,不平衡直接返回,最后计算当前左右子树的高度差,若超过1则说明不平衡直接返回-1,若平衡则返回当前左右子树的最大高度+1(当前节点的高度)。单次迭代过程:先计算左子树的左叶子节点的和,再计算右子树左叶子节点的和,并且判断当前节点的左子节点是否为左叶子节点,加上该值,然后返回。单层迭代:首先判断左右子节点是否为null,不为null就递归,递归完后,需要将当前的节点去除,即回溯操作。
2025-03-13 13:55:05
404
原创 代码随想录算法训练营第14天| 翻转二叉树、对称二叉树、二叉树的最大深度、二叉树的最小深度
对称二叉树的遍历方式是对根节点的左子树和右子树分别遍历,然后同时判断左子树上相同层的左节点与右子树上的右节点(外侧)、左子树的右节点和右子树的左节点(里侧)的值是否相等,只有相等才说明该层是对称的,且该题的遍历方式只能是采用。确定返回条件为int,参数为节点,终止条件为当节点为null时,当前节点的高度为0,单层递归的逻辑为先求左子树的深度,再求右子树的深度,然后,取左右子树深度最大值+1,返回即可。层序遍历法也比较简单,通过遍历每层时,深度++,当队列为空时,返回的深度就是最大深度。
2025-03-12 01:21:21
1638
原创 代码随想录算法训练营第13天|二叉树 三种递归遍历、迭代遍历、统一迭代、层序遍历
二叉树前序遍历的迭代法是使用栈来实现的,由于前序的输出顺序为中左右,那么在遍历节点时就需要反序为右左中的顺序入栈,这样在出栈时元素顺序才符合前序遍历的逻辑,由于前序遍历都是以中间节点作为枢纽进行入栈出栈的操作,因此入栈和出栈的第一个元素就是中间节点,然后再按照右左的顺序使节点入栈、左右的顺序使节点出栈,直到栈为空时,所得的结果数组的顺序就是前序遍历的结果。二叉树的层序遍历中,对左右子节点的判断改为直接对当前节点的children子节点列表遍历,然后添加到队列中即可。层序遍历的基础上,对结果进行反序即可。
2025-03-11 00:30:57
1538
原创 代码随想录算法训练营第11天|150. 逆波兰表达式求值、 239. 滑动窗口最大值、347.前 K 个高频元素
该题的单调队列的作用就是,维护当前窗口内按递减(也可以递增)顺序的元素,此时队列的出口位置一定是当前窗口的最大值,该队列的add方法首先需要判断当前待入队元素和队列入口元素的大小,如果add的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到add元素的数值小于等于队列入口元素的数值为止;Map记录元素出现的频率是必须步骤,但后续的排序不那么容易实现,因此就需要使用“优先级队列”,即小堆顶或大堆顶(本质为完全二叉树)。最后由于优先级队列是小堆顶,弹出顺序为小->大,因此需要倒序弹出。
2025-03-10 11:27:54
420
原创 代码随想录算法训练营第10天|232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项
java中有三种实现栈的数据结构,util.Stack类中的stack、Deque接口的实现类ArrayDeque(基于动态数组)、LinkedList(基于链表实现)。队列实现栈与栈实现队列的方式不一样,因为队列都是“先进先出”的,但也仍然可以采用俩个队列来实现栈的操作,即每次添加新的元素时,先用辅助队列存储,然后再将主队列的所有元素存入到辅助队列(此时新元素位于辅助队列的最前端,即实现了入队元素的倒序插入),然后再将辅助队列与主队列进行交换,由于元素变成的倒序,因此符合了栈的数据结构功能。
2025-03-07 22:25:05
335
原创 代码随想录算法训练营第9天|151.翻转字符串里的单词 卡码网:55.右旋转字符串 28. 实现 strStr() 459.重复的子字符串
该题如果不使用额外空间,那么就需要采用整体翻转+局部翻转的方法,首先对整体进行翻转,然后将字符串分为俩个部分,前半段为n,后半段为length-n,然后对俩个字符串进行翻转即可。反转字符串里的单词是比较综合的题,该题一个难点在于删除多于的空格,其次是解题的思路,采用的是先将所有字符全部都反转,然后针对单个单词再进行反转,就实现了字符串的单词反转操作。该题是KMP算法题,未看懂算法原理,运行调库函数就是java中的String.indexof()(先跳过,等二刷)也是KMP算法题,暂时先跳过。
2025-03-06 22:46:15
165
原创 代码随想录算法训练营第6天|242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
该题初看会以为是一道数学题(我就是这么认为的),实际上题目中给出了当出现“循环”时,表示该数不符合快乐数定义,“循环”也就意味着出现了重复值,那么就可以用set集合,将每次计算的平方和(包括最开始的n)存入集合中,当发现出现重复值时,说明该数不是快乐数,跳出循环,并且判断最后跳出循环的值是否==1,然后返回,该题另一个难点在于计算该数各位置的平方和,用数学的方式也可以计算,但比较不容易总结出规律,于是可以采用转为字符串的形式,将每个数字单独提取进行平方后加和,就是各位置的平方和。
2025-03-03 21:46:19
487
原创 代码随想录算法训练营第4(5)天|● 24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II
该题核心需要分析出,使两条链表从相同长度的起始位置出发,然后往后遍历是否有重合的节点即可,即需要统计两链表的长度l1,l2,然后使长度长的链表(假设为l1,l2同理)先走(l1 - l2)步,使起点对齐,然后遍历链表,找到相同则返回,未找到则返回null。该题的精髓在于双指针的应用,由于删除倒数n位置的节点需要找到当前待删除节点的前置节点,因此,当快指针向钱先移动n+1步时,快慢指针同时移动,在快指针指向null时,慢指针刚好指向倒数n+1的节点,即待删除节点的前置节点位置,此时进行删除操作即可。
2025-03-02 21:30:10
1580
原创 代码随想录算法训练营第三天|链表part01 03.移除链表元素 , 707.设计链表 ,206.反转链表
此题的重点就是处理边界问题,其余的链表操作反而较为容易。这道题难度不高,但有许多需要注意的地方,主要在于对于虚拟头节点的应用、当前cur节点的创建、以及循环条件对节点指针的判断、最后的返回值是真正的头节点等,注意这些部分就会使得问题简单很多,也不容易出错。该题的难点主要在于双指针节点的先后移动顺序,prev节点必须再cur移动前移动到cur的位置,否则就会丢失cur的位置,理解这一点后,该题就比较容易,就是按照保存临时cur.next节点、cur.next指向前一个节点prev,然后。
2025-02-28 22:57:07
232
原创 代码随想录算法训练营第二天|数组理论基础,209. 长度最小子数组,59. 螺旋矩阵2,区间和,开发商买土地
这两天白天一直有事,只能晚上结束后再做题,每天都是deadline打卡。。。
2025-02-27 23:20:50
192
原创 代码随想录算法训练营第一天|数组理论基础,704. 二分查找,27. 移除元素 977有序数组平方
二分法的关键在于对区间的处理,“左闭右闭区间”表示在while循环过程中,每一次缩小区间时,上一个区间的左右边界值都可以取到,因此缩小区间时就需要l = mid+1(或r = mid-1),这样就不会浪费搜索资源,而左闭右开区间则是区间的右边界无法取到,且在while的条件判断中,left不能等于right,因为right为区间右边界值,取不到,每次缩小区间时,右边界只能变成right = mid,因为右边界的值还未进行判断。此外,第一层的for循环i的范围可以一直减小,不必遍历到原数组的长度。
2025-02-26 23:05:27
284
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅