- 博客(138)
- 问答 (1)
- 收藏
- 关注
原创 295. 数据流的中位数
摘要:文章介绍了一种使用双堆结构实时计算数据流中位数的方法。维护一个大顶堆存放较小数,一个小顶堆存放较大数,确保两堆大小差不超过1。奇数时中位数为大顶堆堆顶,偶数时为两堆堆顶平均值。具体实现通过比较新数与当前中位数决定插入堆,并动态调整堆大小保持平衡。该方法插入时间复杂度O(logN),查询中位数O(1),空间复杂度O(N)。(150字)
2025-06-02 14:30:03
276
原创 查找和最小的K对数字
该题解使用优先队列(最小堆)来高效查找两个有序数组中前k个和最小的数对。方法如下: 初始化时,将nums1前min(m,k)个元素分别与nums2首元素组成数对存入优先队列(按数对和排序) 循环k次取出堆顶最小数对,并尝试将nums1当前元素与nums2的下一个元素组成新数对入堆 时间复杂度O(klogk),空间复杂度O(k) 这种方法避免了计算所有数对,通过优先队列动态维护候选数对,逐步扩展找到最优解。
2025-06-02 14:28:03
180
原创 502. IPO
摘要:该算法解决IPO问题,目标是利用有限资本获取最大收益。通过将项目按启动资金升序排序,并使用优先队列选择当前可执行且收益最大的项目。每次执行项目后更新资本,重复操作直至完成k个项目或无项目可选。核心思想是贪心策略,优先选择当前最优解。时间复杂度主要由排序和优先队列操作决定,为O(n log n)。示例展示了如何用初始资本2执行1个项目获得最大收益3。
2025-06-02 14:26:27
202
原创 162. 寻找峰值
本文介绍了两种寻找数组峰值元素的方法。方法一使用单调栈维护递增序列,当遇到需要弹栈时,栈顶即为峰值,时间复杂度O(n)。方法二利用二分查找,通过比较中间元素与其右侧元素的大小关系来缩小搜索范围,最终返回峰值下标,时间复杂度O(logn)。二分法虽然针对无序数组设计,但通过下标的有序性实现高效查找。两种方法都能正确找到峰值元素,测试表明对于单调递增数组会返回最大值作为峰值。
2025-05-26 21:54:21
166
原创 918. 环形子数组的最大和
相比于非环情况,环状的难点是没法找到初始情况,所以就没办法往下推,但是环状的答案分布也有两种,一种是跨越环的分布,另一种是不跨越的(这种情况就是和非环的是一样的),对于跨越的情况可以将环分为两部分(因为数组的和是不变的,所以想找到和最大的子数组和那么对应另一部分肯定就是最小子数组和,最大子数组和(跨越),最小子数组和(不跨越)),所以只要找到不跨越的最小子数组和就行。
2025-05-26 21:51:21
179
原创 postgreSQL下载 + 使用PGvector插件实现向量存储
本文详细介绍了在CentOS7系统上安装PostgreSQL并配置PGvector插件的过程。主要内容包括:1)下载编译PostgreSQL源码并安装到指定目录;2)配置数据库远程连接;3)通过IDEA连接PostgreSQL;4)安装PGvector插件并解决常见路径问题;5)创建测试表验证向量存储和相似度查询功能。文章提供了完整的命令行操作步骤和配置方法,帮助读者快速搭建支持向量数据库功能的PostgreSQL环境。
2025-05-26 12:22:13
673
原创 427. 建立四叉树
本文介绍了一种构造四叉树的递归分治方法。四叉树节点的构造规律是:若区域值全相同则为叶子节点,否则为非叶子节点并继续四分区域。算法通过递归将网格划分为四个子区域,直到单格时创建叶子节点。合并时检查四个子节点是否均为相同值的叶子节点,若是则合并为新叶子节点,否则创建非叶子节点。该方法通过分治策略高效地构建了四叉树结构,时间复杂度为O(n^2),空间复杂度为O(logn)。文中提供了Java实现代码,包含节点类和递归划分、合并逻辑。
2025-05-24 16:00:07
257
原创 148. 排序链表
这道LeetCode题目要求对链表进行排序,采用归并排序算法。通过快慢指针找到链表中点,递归地将链表拆分为单个节点,然后合并有序链表。解决方案包括三个主要方法:divide()用于拆分链表,merge()用于合并有序链表,sortList()作为入口方法。时间复杂度为O(nlogn),空间复杂度为O(logn)的递归栈空间。该实现展示了经典的分治思想在链表排序中的应用。
2025-05-24 15:58:07
371
原创 108. 将有序数组转换为二叉搜索树
这道题目要求将有序数组转换为高度平衡的二叉搜索树(BST)。解题的关键在于理解如何通过递归或迭代的方式构建平衡BST,并掌握平衡二叉树的旋转操作(如左旋、右旋)来保持树的平衡。代码中通过计算树的高度和平衡因子来判断是否需要调整树的结构,并通过旋转操作来恢复平衡。建议在解题前先学习二叉搜索树和平衡二叉搜索树的基本概念,可以参考相关博客或文章来加深理解。
2025-05-23 17:15:14
518
原创 52. N 皇后 II
该问题要求计算在N×N棋盘上放置N个皇后且互不攻击的总方案数。皇后的攻击范围包括同行、同列和两条对角线。通过回溯算法,逐行尝试放置皇后,并在放置后标记冲突位置,避免后续皇后与之冲突。具体实现中,使用二维数组表示棋盘,0表示可用位置,大于0表示冲突位置。递归过程中,若某行成功放置皇后,则继续递归下一行;若所有行都成功放置,则计数加1。通过mark和unmark方法动态标记和取消标记冲突位置,确保回溯时棋盘状态正确。最终返回所有可行方案的总数。
2025-05-23 17:12:19
529
原创 77. 组合
该问题要求从1到n的数字中选取k个数字的所有组合,且组合中的数字需按升序排列。解决思路是使用深度优先搜索(DFS)来生成所有可能的组合。首先,将1到n的数字存储在一个数组中,并创建一个布尔数组来记录哪些数字已被使用。通过DFS递归地构建组合,确保每次选择的数字都大于前一个数字,以保证升序。
2025-05-23 15:04:37
131
原创 17. 电话号码的字母组合
该问题要求生成电话号码数字对应的所有字母组合,适合使用深度优先搜索(DFS)和回溯法解决。代码中定义了一个二维数组 str,存储每个数字对应的字母。letterCombinations 方法初始化结果列表,若输入为空则直接返回。dfs 方法递归地构建组合:当索引达到数字长度时,将当前组合加入结果列表;否则,遍历当前数字对应的字母,依次添加到当前字符串中,并递归处理下一个数字,最后通过回溯删除当前字母以尝试其他组合。该方法确保所有可能的组合都被穷举。
2025-05-23 15:02:21
169
原创 212. 单词搜索 II
文章讨论了在LeetCode上解决“单词搜索II”问题的两种思路。第一种思路是将单词网格转化为字典树,然后搜索单词列表,但这种方法在网格较大时容易超时。第二种思路是将单词列表转化为字典树,然后在网格中搜索路径,这种方法更为高效。文章详细描述了两种方法的实现细节,包括字典树的构建、深度优先搜索(DFS)的应用以及如何避免重复访问。最终,第二种方法被推荐为更优的解决方案,因为它减少了不必要的构建和搜索,提高了算法的效率。
2025-05-23 15:00:56
365
原创 211. 添加与搜索单词 - 数据结构设计
该问题要求设计一个支持添加和搜索单词的数据结构,使用字典树(Trie)实现。字典树的每个节点包含一个长度为26的子节点数组和一个表示单词结束的标志。addWord方法用于将单词插入字典树,逐字符遍历并创建相应的节点。search方法用于搜索单词,支持通配符.,表示可以匹配任意字符。搜索时,若遇到.,则递归遍历所有可能的子节点;否则,按字符匹配。通过递归实现,确保能够处理通配符的复杂匹配情况。
2025-05-23 14:55:51
328
原创 208. 实现 Trie (前缀树)
这篇文章介绍了如何实现一个前缀树(Trie)数据结构,用于高效地存储和检索字符串。前缀树是一种树状结构,每个节点代表一个字母,从根节点到某个节点的路径表示一个字符串。文章详细描述了前缀树的插入、搜索和前缀匹配操作。插入操作通过遍历字符串的每个字符,逐步构建树结构,并在单词结束时标记节点。搜索操作检查字符串是否存在于树中,并验证最后一个节点是否被标记为单词结束。前缀匹配操作则检查是否存在以给定前缀开头的单词。通过这种结构,前缀树能够高效地处理字符串的存储和查询。
2025-05-23 14:50:34
185
原创 127. 单词接龙
这道题目要求找到从 beginWord 到 endWord 的最短转换路径,每次只能改变一个字符,且转换过程中的每个单词都必须在 wordList 中。解题思路与最小基因变化问题类似,采用广度优先搜索(BFS)来寻找最短路径。首先检查 endWord 是否在 wordList 中,若不存在则直接返回 0。然后使用 BFS 从 endWord 开始,逐层遍历与当前单词相差一个字符的单词,并记录路径长度。如果找到与 beginWord 相差一个字符的单词,则返回当前路径长度。通过 differ 函数计算两个字符
2025-05-23 14:47:53
276
原创 433. 最小基因变化
该问题要求找到从初始基因序列 startGene 到目标基因序列 endGene 的最少突变次数,每次突变只能在基因库 bank 中进行。解题思路采用广度优先搜索(BFS),从 endGene 开始反向搜索,逐步找到与 startGene 匹配的路径。首先检查 endGene 是否在 bank 中,若不在则直接返回 -1。使用哈希表记录每个状态与 endGene 的步数差,并通过队列存储待处理的状态。每次从队列中取出一个状态,查找与之相差一个字符且未被访问过的状态,若找到 startGene 则返回当前步数
2025-05-19 22:20:31
317
原创 909. 蛇梯棋
如果((index-1)/nn + 1) & 1 = 1(偶数层),x = nn - ((index-1)/nn + 1) , y = nn - ((index - 1) % nn) - 1。如果((index-1)/nn + 1) & 1 = 0(奇数层),x = nn - ((index-1)/nn + 1) , y = (index - 1)% nn。并且 x&1 == 1(奇数层),board[x][y] = (nn-x-1)* nn + (y + 1)如果nn&1==1上述情况就反一下。
2025-05-19 22:18:22
220
原创 210. 课程表 II
这篇文章介绍了如何通过拓扑排序解决课程安排问题。题目要求根据课程的前置条件,确定一个合理的学习顺序。解题步骤包括:1. 构建课程关系图,记录每门课程的前置和后置课程,并计算每门课程的入度(前置课程数量);2. 使用拓扑排序遍历图,从入度为0的课程开始,逐步学习后续课程;3. 判断是否能够完成所有课程,若存在环则无法完成。文章提供了Java代码实现,通过广度优先搜索(BFS)进行拓扑排序,并最终返回学习顺序或空数组(表示无法完成)。
2025-05-17 13:22:44
135
原创 399. 除法求值
基于之前的分析,本题的核心在于可达性判断。因此,采用并查集(Union-Find)作为解决方案是自然的选择。并查集通过将可达节点相互连接,并利用根节点是否相同来判断节点是否属于同一集合。对于不熟悉并查集的同学,可以参考我撰写的相关文章进行深入了解。这道题的另一个解题方法,使用并查集。
2025-05-17 13:20:49
119
原创 399. 除法求值
该题目要求根据给定的除法方程和查询,计算每个查询的结果。解题思路分为两个主要步骤:首先构建一个矩阵来表示变量之间的关系,然后通过递归判断查询中的变量是否可达并计算结果。具体实现中,使用哈希表为每个变量分配唯一索引,填充矩阵时记录变量之间的比率关系。对于每个查询,通过深度优先搜索(DFS)递归查找路径并计算乘积,若变量不存在或路径不可达则返回-1。最终返回所有查询的结果数组。该问题本质上是图的可达性分析,通过矩阵和递归实现求解。
2025-05-15 23:32:24
286
原创 106. 从中序与后序遍历序列构造二叉树
题目要求根据二叉树的中序遍历和后序遍历结果重建二叉树。思路是利用后序遍历的最后一个元素确定根节点,然后在中序遍历中找到该根节点的位置,将中序遍历分为左子树和右子树。通过计算左右子树的节点个数,可以在后序遍历中确定左右子树的范围。递归地对左右子树执行上述操作,最终构建出完整的二叉树。代码实现中,buildTree方法负责初始化递归过程,method方法递归构建子树,check方法用于验证下标范围是否合法。
2025-05-15 23:21:17
293
原创 暴力的艺术——莫队
莫队算法是一种用于处理离线区间查询问题的优化算法,适用于静态数组上的多查询场景,如统计区间内不同数字的个数或众数等。其核心思想是通过分块和排序优化查询顺序,减少指针移动的浪费。具体来说,莫队将查询范围划分为若干块,先按左边界所在的块排序,若左边界在同一块内则按右边界排序。这种排序方式有效减少了指针移动的复杂度,使得整体时间复杂度从暴力处理的O(n^2)优化至O(n√n)。通过合理地调整查询顺序,莫队算法在处理大规模区间查询时显著提升了效率。
2025-05-14 13:22:39
1119
原创 98. 验证二叉搜索树
该问题要求验证一棵二叉树是否为二叉搜索树(BST)。二叉搜索树的特性是中序遍历结果为升序数组。因此,可以通过中序遍历二叉树,将节点值存入列表,然后检查列表是否严格升序来判断是否为BST。代码实现中,首先定义了一个TreeNode类表示树节点,然后通过midOrder方法进行中序遍历,将节点值存入列表。最后,遍历列表检查是否满足升序条件,若满足则返回true,否则返回false。这种方法清晰且易于理解,确保了二叉搜索树的特性得到验证。
2025-05-14 13:15:24
114
原创 230. 二叉搜索树中第 K 小的元素
在二叉搜索树(BST)中查找第k小的元素,可以利用BST的中序遍历特性。中序遍历BST会得到一个升序排列的元素序列,因此只需进行中序遍历,找到第k个元素即可。本文提供了一个解决方案,通过递归中序遍历将节点值存入列表,最后返回列表中的第k-1个元素。此外,进阶思路建议维护一个动态的升序队列,以便在BST结构变化时快速更新和查询第k小的元素。这种方法在频繁查询和更新BST时更为高效。
2025-05-14 13:11:32
155
原创 530. 二叉搜索树的最小绝对差
这个问题要求找到二叉搜索树(BST)中任意两节点之间的最小绝对差。由于BST的性质,左子树的所有节点值都小于根节点,右子树的所有节点值都大于根节点。因此,最小差值通常出现在根节点与其左子树的最右节点或右子树的最左节点之间。通过遍历树中的所有节点,并计算这些特定节点之间的差值,可以找到全局的最小差值。代码实现中,使用队列进行层次遍历,并通过辅助函数找到左子树的最大节点和右子树的最小节点,最终返回所有可能差值中的最小值。
2025-05-14 13:09:34
162
原创 103. 二叉树的锯齿形层序遍历
该题目要求对二叉树进行锯齿形层序遍历,即在偶数层时从左到右遍历,奇数层时从右到左遍历。与普通层序遍历相比,关键在于在采集数据时,每隔一层对数据进行翻转。具体实现中,使用队列currLevel存储当前层的节点,并通过isReverse标志位控制是否需要翻转。在遍历时,根据isReverse的值决定是否将下一层的节点顺序反转,并将结果存入res中。最终返回res作为锯齿形层序遍历的结果。
2025-05-14 13:07:59
170
原创 637. 二叉树的层平均值
其实还是把每层的节点给找出来,考察的就是二叉树的层序遍历嘛,只要找出每层的节点后续就是遍历求和了,就是要注意节点val的范围我们需要用long来存储。
2025-05-12 10:16:30
103
原创 199. 二叉树的右视图
题目要求返回二叉树每一层最右边的节点值。可以通过层序遍历(BFS)实现,使用两个队列分别存储当前层和下一层的节点。遍历时,将当前层的节点依次出队,并将其左右子节点加入下一层队列。当当前层只有一个节点时,该节点即为该层最右边的节点,将其值加入结果列表。遍历完当前层后,交换两个队列,继续处理下一层,直到所有层遍历完毕。最终返回包含每一层最右边节点值的列表。这种方法的时间复杂度为O(n),空间复杂度为O(n),其中n为二叉树的节点数。
2025-05-12 10:14:46
318
原创 236. 二叉树的最近公共祖先
本文介绍了如何在一个二叉树中找到两个节点的最低公共祖先(LCA)。通过递归遍历树的每个节点,计算以当前节点为根的子树中包含目标节点的数量。当首次发现某个节点的子树中同时包含这两个节点时,该节点即为所求的最低公共祖先。文章提供了Java代码实现,其中method函数用于递归计算子树中包含目标节点的数量,并在首次找到时记录该节点。这种方法利用了树的结构和递归的特性,确保能够高效地找到最低公共祖先。
2025-05-11 11:48:23
146
原创 222. 完全二叉树的节点个数
该问题要求计算完全二叉树的节点数量。完全二叉树的特点是除了最后一层,其他层的节点都是满的,且最后一层的节点尽可能靠左。算法首先通过遍历左子树和右子树来确定树的高度。如果左右子树高度相同,则树是满二叉树,节点数量为 (2^h - 1);否则,使用二分法在最后一层中确定节点的存在。通过将节点的标号转换为二进制,可以确定从根节点到该节点的路径(1表示右,0表示左),从而判断该节点是否存在。最终,通过二分法找到最后一个存在的节点,进而计算出总节点数。该方法的时间复杂度为 (O(\log^2 n))。
2025-05-11 11:45:31
291
原创 133. 克隆图
思路:题目要求我们使用深拷贝,我们首先要知道深拷贝是什么。深拷贝就是再拷贝对象时开辟一块新的空间存放对象,两个对象不共享内存。这题就是让我们遍历所有节点再new新的出来。遍历的方式有很多我这里选择的是bfs。
2025-05-04 12:10:12
160
原创 130. 被围绕的区域
思路:使用两遍dfs,第一遍找到可以被替换区域的可进入点并记录,第二遍就从所有的可进入点入手遍历区域内所有点并替换。这是我的思路,感觉还是挺新颖的(应该很少有人这样想我觉得),算是抛砖引玉了。
2025-05-03 23:20:20
285
原创 124. 二叉树中的最大路径和
对于这题我开始的思路是路径我们可以看作是一条线,我们确定一个点后可以往两侧延伸(就是左右子树的方向),我们通过递归找到以该节点出发的左右两侧的最大路径拼接后就是经过该节点的最大路径和,我们最后只要将所有节点当作出发点遍历一次就可以找到最大路径。所以我们的工作就两步:1.写一个可以以一个节点出发找到最大路径的函数 2.遍历所有节点。
2025-04-09 23:03:18
302
原创 209. 长度最小的子数组
因为是连续子数组,所以一定是在一个连续区间内,我们可以用滑动窗口代表这个区间,然后计算窗口内数的和是否等于target,如果等于target,则更新最小长度,然后移动左指针,如果小于target,则移动右指针扩大区间,如果大于target,则移动左指针缩小区间,直到找到target为止。
2025-04-09 22:13:18
180
原创 11. 盛最多水的容器
我们想让水最多(长*宽),我们一开始能确定的就是宽最大为多少(最两边的柱子围成的水池),但是这并不一定是最大的,而已知宽度已经最大了(之后逐渐变小),所以我们要让长尽可能大,所以我们要让两边的柱子尽可能高,因为短板原理,所以我们要移动两边柱子中较矮的那一个,这就是典型的双指针题。
2025-04-09 22:11:41
243
原创 392. 判断子序列
因为是子序列我们只要关心后一个字符在前一个字符后面出现过就行,至于在哪出现出现几次我们不关心,所以我们可以用HashMap<Character, ArrayList<Integer>> map;题目后面那个拓展应该是让我们保留状态,我能想到比较好的方法就是构造字典树了,比如构造长度为i的字符串的字典树(1<i<=n),这样只用拿长度为i的字符串到对于长度的字典树匹配就行字典树匹配的时间是log n,总的时间就是nlog n,但是构造这样一个字典树组很麻烦,暂时只能想到这了。
2025-04-09 22:01:07
245
原创 117. 填充每个节点的下一个右侧节点指针 II
对于这题我们的主要困难就是怎么判断我们到了一层的末尾,传统的按节点递归是没法判断的,所以我们改进递归方式为按行递归,我们每次进入递归就知道这行已经遍历完了,大致思想就是这样,具体实现我们在代码部分说明.
2025-03-20 18:15:12
170
原创 105. 从前序与中序遍历序列构造二叉树
我们只要找到根节点然后用根节点的值去inorder数组去找,这样就可以将inorder分成两部分左子树的inorder:[9]和右子树的inorder:[15,20,7]其实这个我们只要考虑怎么用前序数组和中序数组来构造一层就行,就像样例preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]我们就可以拿着两棵树的长度去preorder中找到对应部分,左:[9],右:[20,15,7]
2025-03-18 15:58:47
301
原创 100. 相同的树
对于判断树结构我们可以规定用一种数组结构记录,这样我们就可以比较数组来代替比较树了,因为值的范围在[-10**4, 10**4],所以我们约定值为-10**5时代表null。数组结构[a, al, ar, all, alr, arl, arr, ……] (a是根,l代表左子节点,r代表右子节点,以此类推)
2025-03-18 15:55:57
217
while(scanf(""))中空格对输出的影响
2022-09-09
TA创建的收藏夹 TA关注的收藏夹
TA关注的人