自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(157)
  • 问答 (1)
  • 收藏
  • 关注

原创 56. 合并区间

该文章介绍了合并区间的算法思路:先将区间按起始位置排序,然后遍历比较相邻区间。若当前区间结束位置小于下一个区间起始位置,则无重叠直接加入结果;否则合并两区间,取较大的结束位置。代码实现了这一逻辑,使用自定义排序对区间列表进行排序,然后通过遍历比较和更新区间边界来完成合并操作。

2025-08-13 15:07:37 310

原创 53. 最大子数组和

本文介绍了求最大子数组和的贪心算法解法。通过维护当前子数组和currSum和全局最大值maxSum,当currSum为负时舍弃重新开始,否则继续累加。时间复杂度O(n),空间复杂度O(1)。代码实现简洁高效,适用于处理任意长度的整数数组。

2025-08-13 15:04:14 99

原创 239. 滑动窗口最大值

该代码实现了一个滑动窗口最大值算法,使用单调递减的双端栈来高效求解。主要思路是:1)初始化时构建前k个元素的单调栈;2)滑动窗口时,先移除过期元素,再维护栈的单调性,最后将当前元素入栈。通过栈底元素获取当前窗口最大值。时间复杂度O(n),空间复杂度O(k),相比暴力解法更高效。关键点在于维护单调栈结构,确保栈底始终是当前窗口最大值。

2025-07-30 15:31:40 333

原创 560. 和为 K 的子数组

该文讨论了解决LeetCode上"和为K的子数组"问题的两种方法。第一种是暴力解法,使用前缀和数组计算所有可能的子数组和,时间复杂度为O(n²)。第二种优化方法利用哈希表存储前缀和出现次数,通过查找preSum[i]-k是否存在来统计符合条件的子数组数量,时间复杂度降为O(n)。两种方法都避免了滑动窗口算法在处理负数时失效的问题,但后者通过空间换时间显著提升了效率。

2025-07-30 15:29:06 305

原创 438. 找到字符串中所有字母异位词

本文介绍了一种使用滑动窗口算法在字符串中查找所有异位词的方法。通过维护左右指针和两个计数数组(分别记录当前窗口字符和目标字符串字符出现次数),逐步滑动窗口并比较计数数组是否匹配。当匹配成功时记录起始位置,最终返回所有符合条件的起始索引。该方法时间复杂度为O(n),空间复杂度为O(1)(仅使用固定大小的计数数组)

2025-07-28 11:22:56 160

原创 3. 无重复字符的最长子串

本文介绍了一种使用滑动窗口算法求解无重复字符的最长子串长度的方法。通过维护左右指针和哈希表记录字符位置,当遇到重复字符时移动左指针并更新哈希表,同时不断更新最大子串长度。该算法时间复杂度为O(n),空间复杂度为O(字符集大小)

2025-07-28 11:21:01 224

原创 42. 接雨水

这道题使用双指针法解决接雨水问题,时间复杂度O(n),空间复杂度O(1)。定义左右指针分别从数组两端向中间移动,同时维护左右两侧的最大高度。当左指针高度小于右指针时,移动左指针并计算当前位置能接的雨水量(当前左最大高度减去当前高度);否则移动右指针并类似计算。该方法通过单次遍历即可求出总接水量,是一种高效的空间优化算法。

2025-07-28 11:19:14 227

原创 15. 三数之和

该代码实现了一个求解三数之和为0的算法。首先对数组进行排序,然后使用三重循环(外层固定一个数,内层双指针)寻找满足条件的三个数。关键点包括:1) 排序后跳过重复元素避免重复解;2) 使用双指针技巧将时间复杂度从O(n³)优化到O(n²);3) 当和为0时同时移动左右指针并跳过重复值。该解法是解决三数之和问题的经典方法,正确处理了去重和效率问题。

2025-07-27 17:46:53 104

原创 11. 盛最多水的容器

该算法使用双指针法求解容器盛水最大面积问题。初始时,左右指针分别指向数组首尾。每次计算当前指针位置形成的容器面积,并更新最大面积。通过比较两边高度,移动较小高度的指针(因为移动较大高度的指针不会获得更大面积)。时间复杂度O(n),空间复杂度O(1)。该方法高效地找到最大盛水面积,适用于任意高度的垂线排列。

2025-07-27 17:45:49 187

原创 283. 移动零

该算法实现将数组中的零元素移动到末尾。使用双指针法:index_0指向第一个零的位置,index_not_0指向第一个非零的位置。当找到非零元素且在零元素之后时,交换两者值,并更新index_0指向下一个零。时间复杂度O(n),空间复杂度O(1),通过原地交换实现零元素后移,保持非零元素相对顺序不变。

2025-07-27 17:44:19 172

原创 128. 最长连续序列

该文章讨论了两种寻找最长连续序列的算法实现。第一种使用哈希表记录数字状态,遍历时扩展连续序列并标记已访问元素,时间复杂度较高可能超时。第二种优化方法利用集合存储数字,仅从序列起点开始扩展,避免重复计算。当遇到一个数字的前驱不存在时,将其作为序列起点向后扩展,统计连续序列长度。两种方法都处理了空数组情况,返回0。第二种优化方法通过避免不必要的遍历,提高了算法效率。

2025-07-27 15:22:21 144

原创 49. 字母异位词分组

题目要求将字母异位词分组。给出两种Go语言解法: 排序法:将字符串排序后作为哈希表的键,时间复杂度O(nklogk),其中k是字符串最大长度。 计数法:统计每个字符串中字母出现次数,将计数数组作为哈希表键,时间复杂度O(nk),空间效率更高。 两种方法都能正确分组异位词,最终返回分组后的字符串切片。计数法通过字母统计直接生成键值,避免了排序操作,在性能上更优。

2025-07-27 15:19:28 104

原创 120. 三角形最小路径和

这篇文章介绍了一种使用动态规划解决三角形最小路径和问题的算法。算法采用自底向上的方法,首先初始化一个与三角形结构相同的二维数组dp,并将最后一行直接赋值为三角形的对应值。然后从倒数第二行开始向上遍历,每个位置的最小路径和等于当前值加上下一行相邻两个位置的最小值。最终返回三角形顶点的最小路径和。该算法的时间复杂度为O(n²),空间复杂度为O(n²),其中n是三角形的行数。

2025-07-27 15:17:29 85

原创 300. 最长递增子序列

本文介绍了两种求解最长递增子序列(LIS)的算法。第一种是O(n²)的动态规划解法,通过维护dp数组记录以每个元素结尾的最长递增子序列长度。第二种是更优的O(nlogn)解法,结合贪心算法和二分查找:维护一个临时数组dp,遍历时若当前数大于dp末尾则直接添加,否则用二分查找替换第一个大于当前数的元素。这种方法通过替换策略保证序列尽可能长而不影响最终结果。两种方法都能正确计算最长递增子序列长度,后者在效率上更优。

2025-07-27 15:16:23 94

原创 149. 直线上最多的点数

本文介绍了两种计算共线点数的方法:斜率法和向量叉积法。斜率法通过遍历所有点作为出发点,计算与其他点的斜率,并用哈希表统计相同斜率出现的次数,同时单独处理水平和垂直线,最终取最大值。向量叉积法则通过选取两个点作为向量,检查第三点是否共线(满足dx1dy2==dx2dy1条件),通过三重循环统计共线点数。两种方法时间复杂度均为O(n^2)级别,其中斜率法更易于实现,而向量叉积法避免了浮点数精度问题。对于小规模数据,两种方法均可接受。

2025-06-21 11:05:20 174

原创 172. 阶乘后的零

摘要:计算n!末尾零的个数关键在于统计其中5的因子数量。本文提出两种解法:(1)直接遍历5的倍数并统计其含5的数量,时间复杂度O(n);(2)优化方法通过累加n/5、n/25、n/125...来计算5的总数量,时间复杂度O(log₅n)。第二种方法更高效,利用阶乘中5因子的分布规律,避免了逐个计算。两种方法均基于"2的数量多于5,故零的数量由5决定"这一数学原理。

2025-06-21 10:54:06 123

原创 201. 数字范围按位与

题目考察计算区间[left, right]内所有数字按位与的结果。解法基于一个关键观察:连续数字的按位与结果实际上就是它们的公共二进制前缀。通过不断右移left和right直到两者相等,记录右移次数base,最后将公共前缀左移base位即可得到结果。该方法避免了逐位计算的复杂度,时间复杂度为O(log n)。示例代码通过循环右移和计数实现了这一高效算法。

2025-06-21 10:51:20 159

原创 137. 只出现一次的数字 II

摘要:本文介绍了通过统计二进制位数来解决数组中只出现一次数字的问题(其他数字出现三次)。算法将每个数字的二进制位累加,通过判断各位是否能被3整除来识别目标数字的二进制位。对于负数还需处理补码转换。示例代码展示了该方法的实现,包括对输入数组的处理和结果计算。时间复杂度为O(n),空间复杂度为O(1)。

2025-06-21 10:49:14 170

原创 goland有基础速通(需要其它编程语言基础)

Go语言基础速通摘要(150字) 本文针对有其他语言基础的开发者,快速梳理Go核心语法:1)变量类型后置,通过首字母大小写控制访问权限;2)方法支持多返回值;3)结构体+方法组成对象,指针传递避免值拷贝;4)继承通过嵌套结构体实现;5)defer实现延迟执行;6)切片为引用型动态数组;7)map使用make初始化;8)接口实现多态;9)interface{}作为通用类型;10)反射通过reflect包获取类型和值信息。重点对比Java特性,如:=替代var声明、组合替代类继承等。

2025-06-19 14:44:34 1088

原创 295. 数据流的中位数

摘要:文章介绍了一种使用双堆结构实时计算数据流中位数的方法。维护一个大顶堆存放较小数,一个小顶堆存放较大数,确保两堆大小差不超过1。奇数时中位数为大顶堆堆顶,偶数时为两堆堆顶平均值。具体实现通过比较新数与当前中位数决定插入堆,并动态调整堆大小保持平衡。该方法插入时间复杂度O(logN),查询中位数O(1),空间复杂度O(N)。(150字)

2025-06-02 14:30:03 286

原创 查找和最小的K对数字

该题解使用优先队列(最小堆)来高效查找两个有序数组中前k个和最小的数对。方法如下: 初始化时,将nums1前min(m,k)个元素分别与nums2首元素组成数对存入优先队列(按数对和排序) 循环k次取出堆顶最小数对,并尝试将nums1当前元素与nums2的下一个元素组成新数对入堆 时间复杂度O(klogk),空间复杂度O(k) 这种方法避免了计算所有数对,通过优先队列动态维护候选数对,逐步扩展找到最优解。

2025-06-02 14:28:03 193

原创 502. IPO

摘要:该算法解决IPO问题,目标是利用有限资本获取最大收益。通过将项目按启动资金升序排序,并使用优先队列选择当前可执行且收益最大的项目。每次执行项目后更新资本,重复操作直至完成k个项目或无项目可选。核心思想是贪心策略,优先选择当前最优解。时间复杂度主要由排序和优先队列操作决定,为O(n log n)。示例展示了如何用初始资本2执行1个项目获得最大收益3。

2025-06-02 14:26:27 209

原创 162. 寻找峰值

本文介绍了两种寻找数组峰值元素的方法。方法一使用单调栈维护递增序列,当遇到需要弹栈时,栈顶即为峰值,时间复杂度O(n)。方法二利用二分查找,通过比较中间元素与其右侧元素的大小关系来缩小搜索范围,最终返回峰值下标,时间复杂度O(logn)。二分法虽然针对无序数组设计,但通过下标的有序性实现高效查找。两种方法都能正确找到峰值元素,测试表明对于单调递增数组会返回最大值作为峰值。

2025-05-26 21:54:21 177

原创 918. 环形子数组的最大和

相比于非环情况,环状的难点是没法找到初始情况,所以就没办法往下推,但是环状的答案分布也有两种,一种是跨越环的分布,另一种是不跨越的(这种情况就是和非环的是一样的),对于跨越的情况可以将环分为两部分(因为数组的和是不变的,所以想找到和最大的子数组和那么对应另一部分肯定就是最小子数组和,最大子数组和(跨越),最小子数组和(不跨越)),所以只要找到不跨越的最小子数组和就行。

2025-05-26 21:51:21 197

原创 postgreSQL下载 + 使用PGvector插件实现向量存储

本文详细介绍了在CentOS7系统上安装PostgreSQL并配置PGvector插件的过程。主要内容包括:1)下载编译PostgreSQL源码并安装到指定目录;2)配置数据库远程连接;3)通过IDEA连接PostgreSQL;4)安装PGvector插件并解决常见路径问题;5)创建测试表验证向量存储和相似度查询功能。文章提供了完整的命令行操作步骤和配置方法,帮助读者快速搭建支持向量数据库功能的PostgreSQL环境。

2025-05-26 12:22:13 875

原创 427. 建立四叉树

本文介绍了一种构造四叉树的递归分治方法。四叉树节点的构造规律是:若区域值全相同则为叶子节点,否则为非叶子节点并继续四分区域。算法通过递归将网格划分为四个子区域,直到单格时创建叶子节点。合并时检查四个子节点是否均为相同值的叶子节点,若是则合并为新叶子节点,否则创建非叶子节点。该方法通过分治策略高效地构建了四叉树结构,时间复杂度为O(n^2),空间复杂度为O(logn)。文中提供了Java实现代码,包含节点类和递归划分、合并逻辑。

2025-05-24 16:00:07 269

原创 148. 排序链表

这道LeetCode题目要求对链表进行排序,采用归并排序算法。通过快慢指针找到链表中点,递归地将链表拆分为单个节点,然后合并有序链表。解决方案包括三个主要方法:divide()用于拆分链表,merge()用于合并有序链表,sortList()作为入口方法。时间复杂度为O(nlogn),空间复杂度为O(logn)的递归栈空间。该实现展示了经典的分治思想在链表排序中的应用。

2025-05-24 15:58:07 380

原创 108. 将有序数组转换为二叉搜索树

这道题目要求将有序数组转换为高度平衡的二叉搜索树(BST)。解题的关键在于理解如何通过递归或迭代的方式构建平衡BST,并掌握平衡二叉树的旋转操作(如左旋、右旋)来保持树的平衡。代码中通过计算树的高度和平衡因子来判断是否需要调整树的结构,并通过旋转操作来恢复平衡。建议在解题前先学习二叉搜索树和平衡二叉搜索树的基本概念,可以参考相关博客或文章来加深理解。

2025-05-23 17:15:14 529

原创 52. N 皇后 II

该问题要求计算在N×N棋盘上放置N个皇后且互不攻击的总方案数。皇后的攻击范围包括同行、同列和两条对角线。通过回溯算法,逐行尝试放置皇后,并在放置后标记冲突位置,避免后续皇后与之冲突。具体实现中,使用二维数组表示棋盘,0表示可用位置,大于0表示冲突位置。递归过程中,若某行成功放置皇后,则继续递归下一行;若所有行都成功放置,则计数加1。通过mark和unmark方法动态标记和取消标记冲突位置,确保回溯时棋盘状态正确。最终返回所有可行方案的总数。

2025-05-23 17:12:19 535

原创 77. 组合

该问题要求从1到n的数字中选取k个数字的所有组合,且组合中的数字需按升序排列。解决思路是使用深度优先搜索(DFS)来生成所有可能的组合。首先,将1到n的数字存储在一个数组中,并创建一个布尔数组来记录哪些数字已被使用。通过DFS递归地构建组合,确保每次选择的数字都大于前一个数字,以保证升序。

2025-05-23 15:04:37 138

原创 17. 电话号码的字母组合

该问题要求生成电话号码数字对应的所有字母组合,适合使用深度优先搜索(DFS)和回溯法解决。代码中定义了一个二维数组 str,存储每个数字对应的字母。letterCombinations 方法初始化结果列表,若输入为空则直接返回。dfs 方法递归地构建组合:当索引达到数字长度时,将当前组合加入结果列表;否则,遍历当前数字对应的字母,依次添加到当前字符串中,并递归处理下一个数字,最后通过回溯删除当前字母以尝试其他组合。该方法确保所有可能的组合都被穷举。

2025-05-23 15:02:21 174

原创 212. 单词搜索 II

文章讨论了在LeetCode上解决“单词搜索II”问题的两种思路。第一种思路是将单词网格转化为字典树,然后搜索单词列表,但这种方法在网格较大时容易超时。第二种思路是将单词列表转化为字典树,然后在网格中搜索路径,这种方法更为高效。文章详细描述了两种方法的实现细节,包括字典树的构建、深度优先搜索(DFS)的应用以及如何避免重复访问。最终,第二种方法被推荐为更优的解决方案,因为它减少了不必要的构建和搜索,提高了算法的效率。

2025-05-23 15:00:56 378

原创 211. 添加与搜索单词 - 数据结构设计

该问题要求设计一个支持添加和搜索单词的数据结构,使用字典树(Trie)实现。字典树的每个节点包含一个长度为26的子节点数组和一个表示单词结束的标志。addWord方法用于将单词插入字典树,逐字符遍历并创建相应的节点。search方法用于搜索单词,支持通配符.,表示可以匹配任意字符。搜索时,若遇到.,则递归遍历所有可能的子节点;否则,按字符匹配。通过递归实现,确保能够处理通配符的复杂匹配情况。

2025-05-23 14:55:51 343

原创 208. 实现 Trie (前缀树)

这篇文章介绍了如何实现一个前缀树(Trie)数据结构,用于高效地存储和检索字符串。前缀树是一种树状结构,每个节点代表一个字母,从根节点到某个节点的路径表示一个字符串。文章详细描述了前缀树的插入、搜索和前缀匹配操作。插入操作通过遍历字符串的每个字符,逐步构建树结构,并在单词结束时标记节点。搜索操作检查字符串是否存在于树中,并验证最后一个节点是否被标记为单词结束。前缀匹配操作则检查是否存在以给定前缀开头的单词。通过这种结构,前缀树能够高效地处理字符串的存储和查询。

2025-05-23 14:50:34 200

原创 127. 单词接龙

这道题目要求找到从 beginWord 到 endWord 的最短转换路径,每次只能改变一个字符,且转换过程中的每个单词都必须在 wordList 中。解题思路与最小基因变化问题类似,采用广度优先搜索(BFS)来寻找最短路径。首先检查 endWord 是否在 wordList 中,若不存在则直接返回 0。然后使用 BFS 从 endWord 开始,逐层遍历与当前单词相差一个字符的单词,并记录路径长度。如果找到与 beginWord 相差一个字符的单词,则返回当前路径长度。通过 differ 函数计算两个字符

2025-05-23 14:47:53 291

原创 433. 最小基因变化

该问题要求找到从初始基因序列 startGene 到目标基因序列 endGene 的最少突变次数,每次突变只能在基因库 bank 中进行。解题思路采用广度优先搜索(BFS),从 endGene 开始反向搜索,逐步找到与 startGene 匹配的路径。首先检查 endGene 是否在 bank 中,若不在则直接返回 -1。使用哈希表记录每个状态与 endGene 的步数差,并通过队列存储待处理的状态。每次从队列中取出一个状态,查找与之相差一个字符且未被访问过的状态,若找到 startGene 则返回当前步数

2025-05-19 22:20:31 330

原创 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 232

原创 210. 课程表 II

这篇文章介绍了如何通过拓扑排序解决课程安排问题。题目要求根据课程的前置条件,确定一个合理的学习顺序。解题步骤包括:1. 构建课程关系图,记录每门课程的前置和后置课程,并计算每门课程的入度(前置课程数量);2. 使用拓扑排序遍历图,从入度为0的课程开始,逐步学习后续课程;3. 判断是否能够完成所有课程,若存在环则无法完成。文章提供了Java代码实现,通过广度优先搜索(BFS)进行拓扑排序,并最终返回学习顺序或空数组(表示无法完成)。

2025-05-17 13:22:44 143

原创 399. 除法求值

基于之前的分析,本题的核心在于可达性判断。因此,采用并查集(Union-Find)作为解决方案是自然的选择。并查集通过将可达节点相互连接,并利用根节点是否相同来判断节点是否属于同一集合。对于不熟悉并查集的同学,可以参考我撰写的相关文章进行深入了解。这道题的另一个解题方法,使用并查集。

2025-05-17 13:20:49 135

原创 399. 除法求值

该题目要求根据给定的除法方程和查询,计算每个查询的结果。解题思路分为两个主要步骤:首先构建一个矩阵来表示变量之间的关系,然后通过递归判断查询中的变量是否可达并计算结果。具体实现中,使用哈希表为每个变量分配唯一索引,填充矩阵时记录变量之间的比率关系。对于每个查询,通过深度优先搜索(DFS)递归查找路径并计算乘积,若变量不存在或路径不可达则返回-1。最终返回所有查询的结果数组。该问题本质上是图的可达性分析,通过矩阵和递归实现求解。

2025-05-15 23:32:24 297

爱心.exe

爱心.exe

2022-11-16

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除