- 博客(36)
- 收藏
- 关注
原创 ●day 4 任务以及具体安排:第二章 链表part02
(Dummy Head)可以简化链表头部的处理,使得所有交换操作保持一致性。个节点,并返回链表的头节点。这样无论删除的是头节点还是中间/尾节点,逻辑都保持一致,避免了单独处理头节点的情况。本题要求两两交换链表中的相邻节点,并且只能通过节点交换而非修改节点值来实现。:给定一个链表,返回链表开始入环的第一个节点。当两个指针分别走完自己的链表后,继续走对方的链表,最终会走。个节点,即待删除节点的前一个节点。,跳过目标节点,完成删除操作。,即交换后的链表头节点。指向原始链表的头节点。,即删除后的链表头节点。
2025-06-10 00:47:48
875
原创 day 3 任务以及具体安排:第二章 链表part01
本文摘要了力扣两道链表题目的解题思路。203题"移除链表元素"采用虚拟头节点统一处理删除操作,避免了头节点的特殊判断。通过遍历链表并修改前驱节点的next指针,实现高效删除所有目标值节点。206题"反转链表"提供迭代和递归两种解法:迭代法使用双指针逐个反转节点指针;递归法则分解问题,逐步反转链表并处理边界条件。两种方法均能实现链表反转,但时空复杂度有所不同。文中附有详细的代码实现和关键步骤说明。
2025-06-08 00:14:56
372
原创 ●day 2 任务以及具体安排:第一章 数组part02
循环条件的本质是通过数学规律控制螺旋矩阵的填充层数偶数情况:恰好填满所有层。奇数情况:填满外层后,剩余中心点单独处理。这种设计既保证了代码的简洁性,又避免了重复填充或遗漏元素的问题。
2025-06-01 22:07:01
964
原创 day 1 任务以及具体安排:第一章 数组part01
本文介绍了三个经典数组问题的解决方案:二分查找:对于有序无重复数组,使用左闭右闭区间,通过调整左右指针快速定位目标值,时间复杂度O(logn)。移除元素:双指针法原地修改数组,快指针遍历,慢指针记录有效元素位置,保证前k项为保留元素,时间复杂度O(n)。有序数组平方:通过双指针从数组两端比较平方值,逆序填充结果数组,确保有序性,时间复杂度O(n)。三题均采用指针技巧,分别展示了搜索、删除和转换的高效处理方法。
2025-06-01 17:19:44
1046
原创 day 37 第九章 动态规划part05
本题是一个典型的利用动态规划解决组合计数的问题,本质上可以类比为完全背包问题(因为每种面额的硬币有无限个,就像完全背包里每种物品可以无限次取用一样)。本题属于组合计数类的动态规划问题,和前面一些背包问题的变体有相似之处,但又有所不同,这里着重考虑元素组合的顺序,即顺序不同的序列被视作不同的组合。时的元素组合的个数,然后利用已知的状态(更小总和时的组合个数情况)去推导出更大总和时的组合个数。时,有一种特殊的组合情况,就是什么元素都不选,这也算作是一种有效的 “组合”,所以把它初始化为。当两层循环都结束后,
2024-12-07 23:18:33
1233
原创 day 36 第九章 动态规划part04
核心想法是要使得最后剩下石头的重量最小,我们可以把所有石头的总重量分成两堆尽量接近的石头堆(想象成把这些石头分别装进两个虚拟的 “背包”),然后用总重量减去这两堆石头重量和的差值(也就是较大堆减去较小堆),就能得到最后剩下石头的最小重量了。就相当于背包的容量,而每块石头就相当于 01 背包里的物品,每个物品(石头)只有选或者不选两种情况,放入其中一堆石头(一个 “背包”)里,然后通过动态规划求出在这个 “容量” 限制下能装的最大重量,进而算出最后剩下石头的最小重量。中的每个二进制字符串就是 “物品”。
2024-12-05 18:32:38
1306
原创 day 35 第九章 动态规划part03
的所有元素总和看成是背包的 “容量”,而要达成的目标是能否将这些元素分成两部分,使得两部分的和相等,也就是看能否从这些元素中挑选出一部分元素,它们的和恰好等于总和的一半(就好像往背包里装一些物品,让背包里装的物品价值总和刚好达到一个特定值一样)。在这里,数组中的每个元素就相当于 01 背包问题里的物品,每个元素都只有选(放入一个子集)或者不选(不放入这个子集)这两种情况,而且不能分割元素,这完全符合 01 背包问题的特征,即每个物品只能取 0 次或 1 次,所以可以用 01 背包的思路来解决本题。
2024-12-04 10:11:30
986
原创 day 34 第九章 动态规划part02
本题考查利用动态规划的思想来求解机器人在网格中从左上角移动到右下角的不同路径数量,核心思路是基于网格中每个位置的路径数量与它相邻的上侧和左侧位置的路径数量存在关联关系,通过逐步递推来计算出最终目标位置的路径数量,以下是详细说明:确定使用动态规划: 因为要计算机器人到达右下角的总不同路径数,而到达网格中每个位置的路径数量取决于它前面的位置(上方和左方位置,因为机器人只能向下或者向右移动)能够到达该位置的路径数量,具有明显的重叠子问题和最优子结构性质,符合动态规划的特征,所以采用动态规划来解题。定义状态和状态
2024-12-02 15:04:12
828
原创 day 32 第九章 动态规划part01
本题要求根据斐波那契数列的定义来计算给定 对应的斐波那契数 。斐波那契数列的特点是从第 0 项和第 1 项开始(分别为 0 和 1),后面每一项都是前面两项之和,即 ( 时)。解题思路采用了动态规划的方法: 第二题:70. 爬楼梯 解题思路本题考查的是通过动态规划的思想来解决爬楼梯有多少种不同方法的问题,核心思路是根据前面已有的状态推导出后续的状态,以下是详细说明:确定使用动态规划: 因为要计算爬到 阶楼梯的不同方法数,而爬到每一个台阶的方法数其实和前面台阶的方法数存在关联,符合动态规划
2024-12-01 17:03:42
1146
原创 day 30 第八章 贪心算法 part04
首先需要知道每个字母在字符串中出现的最远距离,然后从字符串开头开始遍历,不断更新当前片段中字母出现的最远距离,当遍历到的位置正好是当前片段中所有字母出现的最远距离时,就说明可以划分出一个片段了,记录下这个片段的长度,接着继续往后遍历确定下一个片段,以此类推,最终得到所有划分片段的长度列表。通过对气球的直径范围按照起始位置进行排序,然后依次遍历气球,根据相邻气球的范围关系来判断是否可以用同一支箭引爆它们,不断合并可以用同一支箭引爆的气球范围,最终统计出最少需要射出的弓箭数量。例如,若原区间集合是。
2024-11-30 21:34:14
1296
原创 day 31 第八章 贪心算法 part05
我们从数字的高位往低位去检查每一位数字,如果发现相邻的高位数字大于低位数字(不符合单调递增),那就需要对高位数字进行减 1 操作,并且把从这个高位数字往后的所有低位数字都变为 9,这样能保证在满足小于等于原数字。,它用于记录从哪个位置开始后面的数字都要变为 9,初始设为字符串长度是一种默认的初始化状态,后续会根据实际情况更新。),这样就实现了把从出现不符合单调递增位置往后的所有低位数字都设为 9 的操作,使得得到的数字在满足条件的情况下尽可能大。经过前面的循环处理完不符合单调递增的高位数字后,通过另一个。
2024-11-30 21:20:20
1268
原创 day 29 第八章 贪心算法part03
贪心算法在这里的体现是,我们尝试从每一个加油站出发去模拟绕环路行驶的过程,在这个过程中,一旦发现从某个加油站出发走到某个位置时油箱里的油不够继续往下走了(也就是累积剩余油量小于 0 了),那就没必要再从这个加油站以及之前的加油站继续尝试了,而是直接从下一个加油站重新开始尝试,通过这样不断尝试和排除不合适的出发点,最终找到能绕环路行驶一周的出发加油站编号,或者确定不存在这样的加油站(返回 -1)。如果发现当前孩子的评分。,此时为了满足相邻评分更高的孩子糖果更多的条件,当前孩子的糖果数应该取当前已有的糖果数。
2024-11-28 18:00:50
1204
原创 day 28 第八章 贪心算法 part02
贪心算法在这里的体现是,我们不考虑整体的买卖策略规划,而是着眼于每一天的价格变化情况,只要发现第二天的股价比第一天高,那我们就在第一天买入,第二天卖出,这样就能获取这两天之间的差价利润,通过不断累积这些差价利润,最终就能得到总的最大利润。贪心算法的体现是,我们不尝试去枚举所有可能的跳跃组合方式来找到最小跳跃次数,而是在每一步跳跃中,都尽可能选择能拓展更远覆盖范围的位置进行跳跃,通过不断更新覆盖范围以及记录跳跃次数,最终得到到达终点的最小跳跃次数。或者长度为 0,那自然不存在跳跃一说,直接返回 0;
2024-11-26 15:05:31
1084
原创 day 27 第八章 贪心算法 part01
贪心算法在此处的体现是,我们在遍历数组时,每一步都基于当前的情况做出局部最优选择,即只要当前连续子数组的累加和是正数,就有可能对后续形成更大的和有帮助,那就继续累加;而一旦累加和变为负数了,那它对于后续求最大和就没有好处了,此时就舍弃之前的累加结果,重新开始计算新的连续子数组的和,通过这样不断地选择,最终找到整个数组中的最大子数组和。贪心算法在这里的体现就是,我们希望尽可能多地保留那些能让序列呈现出摆动特性(差值正负交替)的元素,每遇到一次符合摆动特征的相邻元素对,就认为可以增加摆动序列的长度。
2024-11-25 21:44:45
1263
原创 day 25 第七章 回溯算法part04
这个辅助方法进行回溯操作,从空的排列开始,逐步往里面添加元素,尝试所有可能的排列组合情况,将得到的每一种全排列结果添加到最终的。方法进行回溯操作,从空的排列开始,逐步往里面添加元素,尝试所有可能的排列组合情况,将得到的不重复的全排列结果添加到最终的。,这样就回到了添加这个元素之前的状态,能够去尝试其他的元素选择,继续探索不同的排列组合情况。,这样就回到了添加这个元素之前的状态,能够去尝试其他的元素选择,继续探索不同的排列组合情况。数组的长度时,意味着已经得到了一种完整的全排列情况,此时将这个。
2024-11-25 10:50:00
944
原创 day 24 第七章 回溯算法part03
的所有子集(幂集),且不能包含重复子集,采用回溯算法来解决是比较合适的思路。可以将其想象成构建一棵多叉树的过程,树的每一层代表从数组中选取元素的不同阶段,每个节点的分支就是选择当前元素或者不选择当前元素,通过遍历这棵树的所有节点路径就能得到所有的子集。思路是先对数组进行排序,这样相同的元素会相邻,在回溯构建子集的过程中,通过额外的标记数组。找出所有可能的有效 IP 地址组合,采用回溯算法来解决比较合适。来判断是否已经使用过相同元素的前一个元素,以此来决定是否跳过当前元素,从而避免重复子集的产生。
2024-11-23 23:05:35
872
原创 day 23 第七章 回溯算法part02
本题同样是关于找出给定数组中数字的组合使其和等于目标数,但与上一题不同的是,这里数组中的每个数字在每个组合中只能使用一次,并且解集不能包含重复的组合。依然采用回溯算法来解决,不过为了避免重复组合以及处理好每个数字只能用一次的限制,需要额外做一些处理。分割成一些子串,且要求每个子串都是回文串,然后找出所有可能的分割方案。这里采用回溯算法来解决,通过不断尝试不同的分割点,判断分割出的子串是否为回文串,若是则继续往下分割,若不是则跳过该分割方式,以此来遍历所有可能的分割情况,找到所有满足条件的方案。
2024-11-23 20:37:57
883
原创 day 22 第七章 回溯算法part01
时,意味着已经遍历完了输入数字字符串的每一位数字,此时当前构建的临时字母组合。中,然后结束当前这一层的递归调用,返回上一层继续探索其他可能的字母组合情况。就是一种满足条件的结果,将其转换为字符串(通过。个数的组合,且限定只用数字。本题要求找出所有相加之和为。17.电话号码的字母组合。216.组合总和III。
2024-11-21 16:45:30
1059
原创 day20 第六章 二叉树part07
要删除二叉搜索树中的指定节点并保持二叉搜索树的性质不变,需要先找到该节点,然后根据节点的不同情况(比如有无左子树、右子树等)来进行相应的删除操作,最后返回更新后的二叉搜索树的根节点。
2024-11-18 14:36:29
921
原创 第六章 day 18 二叉树part06
因为后序遍历是先处理子树,再处理根节点,这样可以自底向上地去查找公共祖先,从叶子节点逐步往根节点方向排查,当在某个节点处发现其左右子树分别包含了。利用二叉搜索树中序遍历后节点值有序的特性,通过中序遍历二叉搜索树,依次比较相邻节点值的差值,从中找出最小的差值作为结果返回。要找出二叉搜索树中的众数(出现频率最高的元素),利用二叉搜索树中序遍历后节点值有序的特点,通过中序遍历二叉搜索树来统计每个值出现的频次,进而找出众数。,它将用于存储最终的最小差值,初始化为最大值是为了后续能通过比较不断更新得到更小的差值。
2024-11-17 15:31:19
981
原创 第六章 day17 二叉树part05
具体来说,就是从两棵树的根节点开始同步向下递归,根据节点的存在情况和合并规则处理每个对应位置的节点,最终得到合并后的二叉树。本题要验证给定的二叉树是否为二叉搜索树,核心思路是通过中序遍历二叉树,并利用二叉搜索树中节点值大小的特性(左子树节点值小于根节点值,右子树节点值大于根节点值,且左右子树也都要是二叉搜索树)来进行递归判断。这里借助一个类成员变量。整体思路是利用二叉搜索树的特性(左子树节点值小于根节点值,右子树节点值大于根节点值),通过递归的方式从根节点开始逐步向下查找目标节点。98.验证二叉搜索树。
2024-11-15 21:01:42
925
原创 第六章 day14 二叉树part03
定义平衡条件:递归方法:终止条件:高度计算与平衡性检查:主函数:第二题:257. 二叉树的所有路径 定义路径:递归方法:回溯:终止条件:第三题:404.左叶子之和解题思路 定义左叶子节点:递归方法:终止条件:第四题:222.完全二叉树的节点个数 完全二叉树的特性:递归方法:终止条件:
2024-11-13 16:09:25
637
原创 第六章 day14 二叉树 part02
方法是一个辅助方法,用于交换给定节点的左右子节点。这是递归的基本终止条件,因为没有节点可以交换。104.二叉树的最大深度。111.二叉树的最小深度。101. 对称二叉树。
2024-11-12 15:59:37
767
原创 第五章 day11 栈与队列part02
逆波兰表达式的计算非常适合使用栈来实现。当我们遇到一个操作数时,将其压入栈中;当我们遇到一个操作符时,从栈中弹出两个操作数,进行相应的运算,然后将结果重新压入栈中。:单调队列是一种特殊的队列,其中的元素保持某种单调性(递增或递减)。在这个问题中,我们需要维护一个递减的单调队列,这样队列的头部始终是当前滑动窗口的最大值。:遍历完所有的 token 后,栈中只剩下一个元素,这个元素就是表达式的计算结果。:直接将操作数转换为整数并压入栈中。150. 逆波兰表达式求值。:我们从左到右遍历数组。
2024-11-10 23:30:22
496
原创 第五章 day10 栈与队列part01
为了实现后进先出的效果,我们需要将队列中的前 n-1 个元素重新放回队列的末尾,这样最后一个元素就会成为队列的头部,可以直接弹出。这个操作的时间复杂度为 O(n),其中 n 是队列中的元素数量。:这个函数负责将队列中的前 n-1 个元素重新放回队列的末尾,以便最后一个元素成为队列的头部。我们可以使用一个栈来存储遍历过程中遇到的字符,并在遇到与栈顶字符相同的字符时将其弹出。操作,先将队列中的前 n-1 个元素重新放回队列的末尾,然后弹出最后一个元素并将其重新放回队列。的顶部总是队列的最前端元素。
2024-11-10 15:46:00
778
原创 第四章 day8 字符串part01
这种方法的时间复杂度为 O(n),其中 n 是数组的长度,因为每个元素只被访问一次。空间复杂度为 O(1),因为我们只使用了几个额外的变量来存储指针和临时值。根据题目要求,可以采用双指针的方法来解决问题。541. 反转字符串II。卡码网:54.替换数字。
2024-11-07 17:19:53
270
原创 第三章 day7 哈希表part02
在编程竞赛和算法设计中,“剪枝”是一种优化技术,用于减少不必要的计算,提高算法的效率。在具体问题中,剪枝通常指的是在搜索或遍历过程中,通过一些条件判断提前终止某些分支的进一步探索,从而减少计算量。
2024-11-06 15:03:57
1116
原创 代码随想录 day 3 第二章 链表part01
第一题:203.移除链表元素思路dummydummy.nextheadcurdummywhilecur.nextnullcur.nexttargetcur.nextcurdummy.next707.设计链表ListNode首先定义了节点类ListNodeint val①成员变量int size②构造函数sizehead③方法如果索引index无效(小于0或大于等于链表大小),则返回 -1。否则,从虚拟头节点开始遍历至第index + 1个节点(因为虚拟头节点不算作实际数据节点),并返回该节点的值。
2024-11-02 11:05:31
661
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1