- 博客(60)
- 收藏
- 关注
原创 代码随想录算法训练营(JAVA)| 第七章 回溯算法part03
切割问题可以抽象为组合问题如何模拟那些切割线切割问题中递归如何终止在递归循环中如何截取子串如何判断回文切割过的地方不能重复切割所以递归函数需要传入i + 1。
2024-03-18 12:39:35 736
原创 代码随想录算法训练营(JAVA)| 第六章 二叉树part08
力扣236. 二叉树的最近公共祖先,235. 二叉搜索树的最近公共祖先,701. 二叉搜索树中的插入操作,450. 删除二叉搜索树中的节点
2024-03-13 03:41:21 913
原创 代码随想录算法训练营(JAVA)| 第六章 二叉树 part06
力扣654. 最大二叉树,617. 合并二叉树,700. 二叉搜索树中的搜索,98. 验证二叉搜索树
2024-03-11 15:00:19 884
原创 代码随想录算法训练营(JAVA)| 第六章 二叉树 part05
力扣513. 找树左下角的值, 112. 路径总和,113. 路径总和 II,106. 从中序与后序遍历序列构造二叉树
2024-03-10 18:38:07 560
原创 代码随想录算法训练营(JAVA)| 第六章 二叉树 part02
力扣102. 二叉树的层序遍历, 226. 翻转二叉树, 101. 对称二叉树
2024-03-07 15:17:02 546
原创 代码随想录算法训练营(JAVA)| 第六章 二叉树part03
力扣104. 二叉树的最大深度, 559. N 叉树的最大深度,111. 二叉树的最小深度,222. 完全二叉树的节点个数
2024-03-07 15:15:27 435
原创 力扣 4. 寻找两个正序数组的中位数
因此,我们可以安全地排除 (A) 中的前 (k/2) 个元素,然后在剩下的元素中寻找第 (k - k/2) 小的元素。由于 (A[k/2 - 1]) 小于 (B[k/2 - 1]),我们可以确定,在 (B) 数组中至少有 (k/2) 个元素是大于 (A[k/2 - 1]) 的。这里的关键点是,如果 (A[k/2 - 1]) 小于 (B[k/2 - 1]),那么 (A[k/2 - 1]) 以及它之前的所有元素(共 (k/2) 个元素)都不可能是第 (k) 小的元素。:根据比较结果,我们排除一部分元素。
2024-03-06 01:33:59 1176
原创 代码随想录算法训练营(JAVA)| 第六章 二叉树part01
力扣144. 二叉树的前序遍历,94. 二叉树的中序遍历,145. 二叉树的后序遍历
2024-03-05 12:46:00 667
原创 代码随想录算法训练营(JAVA)| 第五章 栈与队列part02
力扣20.有效的括号1047.删除字符串中的所有相邻重复项150.逆波兰表达式求值
2024-03-02 14:50:04 673
原创 代码随想录算法训练营(JAVA)| 第四章 字符串part02 DAY08
力扣28. 找出字符串中第一个匹配项的下标, 459. 重复的子字符串
2024-02-29 10:52:10 192
原创 代码随想录算法训练营(JAVA) |第四章 字符串part01 DAY07
力扣344. 反转字符串,541. 反转字符串 II,54. 替换数字,151. 反转字符串中的单词,55. 右旋字符串
2024-02-28 18:53:07 585
原创 代码随想录算法训练营(JAVA) | 第三章 哈希表part02 DAY06
力扣454. 四数相加 II,383. 赎金信,15. 三数之和,18. 四数之和
2024-02-27 10:52:27 342
原创 代码随想录算法训练营(JAVA) | 第三章 哈希表part01 DAY05
力扣242. 有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
2024-02-26 19:08:23 450
原创 代码随想录算法训练营(JAVA) | 第二章 链表part02 DAY04
力扣24. 两两交换链表中的节点,707. 设计链表面试题 02.07. 链表相交707. 设计链表,19. 删除链表的倒数第 N 个结点,142. 环形链表 II
2024-02-26 14:49:19 412
原创 代码随想录算法训练营(JAVA) | 第二章 链表part01 DAY03
力扣 203. 移除链表元素,707. 设计链表,206. 反转链表
2024-02-25 21:44:06 181
原创 代码随想录算法训练营(JAVA) | 第一章 数组 part02 DAY02
力扣977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II
2024-02-21 15:49:57 400
原创 二分搜索法的探究与心得
left + 1!= right精确的边界控制:通过保持left和right之间的间隔,这种方法减少了边界值的特殊处理,使得代码更加简洁。逻辑一致性:更新left或right变得一致和直观,不再需要额外的if判断来避免包含或排除中点值。减少错误:由于不需要处理mid - 1或mid + 1,此方法减少了由于错误更新索引而导致的无限循环或漏掉正确元素的风险。清晰的搜索意图:代码清晰地表达了搜索意图,特别是在区间分割的策略上,这对于阅读和维护代码的人来说是一个巨大的优势。可扩展性。
2024-02-11 22:10:02 715
原创 状态压缩DP--最短Hamilton路径问题的状态压缩动态规划解法
状态压缩动态规划可以在处理特定类型的组合问题时非常有用,尤其是当问题涉及到需要考虑集合的所有子集时。在这个最短Hamilton路径问题中,我们需要考虑经过每个点恰好一次的所有可能路径。为了做到这一点,我们使用状态压缩DP来枚举所有可能的点的子集,然后计算在这个子集内部,以每个点作为终点的最短路径长度。我们使用一个整数来表示状态(即点的集合)。整数的每一位对应一个点,如果某一位是1,表示该点包含在集合中;如果是0,表示不包含。例如,对于4个点的图,二进制数1011。
2024-02-06 15:12:29 764
原创 动态规划解决棋盘覆盖问题:一步步教你理解
在这个问题中,我们用f[i][j]来表示考虑到第i列时,整个棋盘的前i列形成的状态为j的覆盖方式的总数。这里的j是一个二进制数,用来表示这一列的覆盖情况,每一位代表一行,0表示该行未被覆盖,1表示该行已被覆盖。关于二进制数举个例子:第 i 列 :011000第i+2列:000010在棋盘覆盖这样的问题中,使用二进制数来表示状态是一种非常有效的方法。它可以直观地表示每一列的覆盖状态,其中每一位代表一行是否被覆盖。在你提供的例子中,我们可以将第 i 列和第 i+2 列的覆盖状态表示为二进制数。
2024-02-06 11:26:57 997
原创 统计数字出现次数的数位动态规划解法-数位统计DP
数位DP是一种用于解决与数字的各个数位相关的问题的动态规划技术。它通常涉及到将问题分解为更小的、更易于管理的子问题,然后使用递归或迭代来解决这些子问题,同时避免重复计算。数位DP问题的关键在于如何定义状态和状态转移方程。在数位统计问题中,一个常见的状态定义包括:当前处理的数位位置(从最低位到最高位)当前数位的取值范围是否受到限制(即是否需要与给定的上限数值相匹配)其他可能影响问题解的额外条件,如前导零的处理、特定数位的取值等状态转移则依赖于当前处理的数位以及之前数位的选择如何影响后续数位的选择。
2024-02-06 01:31:16 1615
原创 最短编辑距离问题与动态规划----LeetCode 72.编辑距离
在这个问题中,我们定义f[i][j]为从word1的前i个字符转换到word2的前j个字符所需的最少操作次数。这个定义本身就隐含了一个最优子结构的性质,即要得到f[i][j]的值,我们可以依赖于f[i-1][j]f[i][j-1]和的值,这些都是更小的子问题。
2024-02-04 15:04:50 882
原创 做了三遍才懂的动态规划之线性DP---LeetCode 300. 最长递增子序列
为了构造尽可能长的上升子序列,我们采取的策略是让子序列的增长尽可能慢,即在相同长度的子序列中,选择末尾数最小的一个。:在所有长度相同的递增子序列中,末尾元素越小,为后续元素提供加入递增子序列的可能性越大,从而可能形成更长的递增子序列。数组中尽可能地使用较小的值,我们为后续的元素留出了更多的上升空间,从而使得整个上升子序列尽可能地长。数组中的所有元素,这意味着我们找到了一个更长的上升子序列,因此我们需要扩展。的上升子序列中末尾元素的最小值。数组中的正确位置,从而可以通过尽可能小的更新来延长上升子序列的长度。
2024-02-04 00:34:29 974
原创 [笔记]事务简介-springboot
同样地,在Spring Boot中,如果在同一个类中,一个没有使用事务的方法调用了一个使用了事务的方法,事务是不会生效的。例如,当一个事务方法被另一个事务方法调用时,是否要加入已存在的事务,或者创建一个新的事务等。注解在配置类上启用事务管理,但在Spring Boot中这通常是不必要的,因为Spring Boot的自动配置已经包含了事务管理的支持。Spring Boot沿用了Spring的事务管理概念,但在配置和使用上更为简化,主要依赖于注解来管理事务。当应用于类上时,该类的所有公共方法将成为事务方法。
2024-01-24 00:08:19 1028
原创 顺时针打印矩阵:偏移量法与边界控制法比较---剑指offer-JZ29 顺时针打印矩阵
矩阵遍历使用的x和y的定义有些特殊。通常,在数学和计算机图形学中,我们习惯于将x轴定义为水平方向,y轴定义为垂直方向。然而,在二维数组或矩阵的上下文中,这些轴的定义通常与传统的笛卡尔坐标系有所不同。在代码中x变量代表的是二维数组的行索引。y变量代表的是二维数组的列索引。然而,当我们说“向上”移动时,实际上是在减少x的值(因为在数组中向上移动意味着向更小的行索引移动)。同样,"向右"移动实际上是增加y的值(在数组中向右移动意味着向更大的列索引移动)。“向下”移动是增加x的值。“向左”移动是减少y。
2024-01-22 20:45:07 1196
原创 位运算实现整数加法解析与实现---剑指offer-JZ65 不用加减乘除做加法
在计算机科学和编程中,位运算是一种高效的运算方式,尤其是在资源受限的环境下。最近,我遇到了一个有趣的问题:如何仅使用位运算实现两个整数的加法?这个问题不仅仅是一个编程练习,更深入地理解了计算机如何在底层处理数据。
2024-01-19 03:55:28 755
原创 深入理解归并排序与逆序对计算---剑指offer-JZ51 数组中的逆序对
当我们合并两个子数组时,如果左侧数组的元素大于右侧数组的元素,那么左侧数组当前元素及其后面的所有元素都将与右侧的这个元素形成逆序对。通过这种方式,函数在合并两个子数组的同时,准确地统计了逆序对的数量。如果左侧元素大于右侧元素,那么左侧的这个元素和它右边的所有元素(因为左侧子数组是有序的)都会与右侧的这个元素形成逆序对。因为左侧数组是有序的,所以如果一个左侧元素大于右侧的元素,那么左侧这个元素及其后面的所有元素都大于这个右侧的元素。函数中的核心,它负责合并两个已排序的子数组,并在这个过程中计算逆序对的数量。
2024-01-18 21:05:33 1406
原创 官方题解说明---剑指offer-JZ44 数字序列中某一位的数字
是172,则它会落在2位数的区间,因为172超过了1位数区间的长度(9),但不超过1位数和2位数区间总长度(9+180=189)。对应的是几位数的数字,然后找到具体的数字,最后确定是该数字的哪一位。是172 - 9 = 163,表示172是2位数区间的第163位。每个区间的起始数字是1、10、100等,这些数字是以10的幂递增的。,表示172是数字91的第1位(从0开始计数),所以答案是9。在上面的例子中,2位数的起始数字是10,区间长度是180。加上区间的起始数字,就可以找到具体的数字。
2024-01-18 03:05:58 365
原创 深入理解二叉树的序列化和反序列化---剑指offer-JZ37 序列化二叉树
序列化过程采用前序遍历,将每个节点的值转换为字符串,并用特殊字符(如'#')表示空节点。反序列化过程则根据这个字符串重新构建出原始的二叉树结构。
2024-01-18 01:15:58 933
原创 利用双端队列高效解决滑动窗口最大值问题---剑指offerJZ59 滑动窗口的最大值
通过使用双端队列,我们可以高效地解决滑动窗口的最大值问题。双端队列的灵活性在于能够从两端对队列进行操作,这使得它在许多场景下都非常有用,尤其是在需要快速访问头部和尾部元素的情况下。
2024-01-18 00:33:23 839
原创 将二叉搜索树转换成排序的双向链表:深入解析与实现 ——剑指offer - JZ36 二叉搜索树与双向链表
在双向链表中,尾节点是最后一个节点,即没有后继节点的节点。在从二叉搜索树转换成的双向链表中,尾节点是树中值最大的节点,因为二叉搜索树的特性决定了任何节点的右子树包含的值都大于该节点,所以最右侧的节点是值最大的。
2024-01-12 23:24:41 440
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人