自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(257)
  • 资源 (1)
  • 收藏
  • 关注

原创 扩展摩尔投票法:找出出现次数超过 n/3 的元素

在解决多数元素问题时,我们学习了经典的摩尔投票法处理出现次数超过 n/2 的情况。那么,当问题扩展为**找出出现次数超过 n/3 的元素**时,该如何解决呢?本文将深入探讨摩尔投票法的扩展应用。

2025-05-28 17:58:46 441

原创 LeetCode 169:多数元素 - 摩尔投票法的精妙解法

给定一个大小为 `n` 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 **大于** `⌊n/2⌋` 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。

2025-05-28 17:56:04 446

原创 LeetCode 136:只出现一次的数字 - 巧用异或运算的极致解法

给定一个**非空**整数数组 `nums`,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

2025-05-28 17:32:57 535

原创 LeetCode 138. 复制带随机指针的链表(Java实现:原地复制法)

给定一个链表的头节点 `head`,链表中每个节点包含两个指针:`next` 和 `random`。其中:- `next` 指向链表中的下一个节点。- `random` 可能指向链表中的任意节点,或为 `null`。要求对这个链表进行**深拷贝**,返回复制链表的头节点。深拷贝意味着必须完全创建新节点,且新链表与原链表独立,不共享任何内存空间。

2025-05-21 10:00:00 305

原创 LeetCode 438. 找到字符串中所有字母异位词 | 滑动窗口与字符计数数组解法

给定两个字符串 `s` 和 `p`,要求找到 `s` 中所有是 `p` 的**字母异位词(Anagram)**的子串的起始索引。 **字母异位词**是指由相同字母重新排列形成的字符串(包含相同的字母且每个字母出现的次数相同)。

2025-05-20 16:46:24 471

原创 全排列问题深度解析:为何无需index参数且循环从i=0开始?

在全排列问题中,尤其是包含重复元素(如 LeetCode 47. 全排列 II)时,回溯算法的实现有两个关键设计点常引发困惑:1. **回溯函数为何不需要 `index` 参数?**2. **循环遍历的起点为何是 `i=0` 而非 `index`?**

2025-05-20 15:09:04 1194

原创 LeetCode 35. 搜索插入位置:二分查找的边界条件深度解析

本文详细解析 LeetCode 35 题《搜索插入位置》的解题思路,重点探讨二分查找中循环条件 `left <= right` 的必要性,并提供 Java 实现代码。通过边界案例分析和常见错误解答,帮助读者深入理解二分查找的边界处理逻辑。

2025-05-18 12:30:00 1859

原创 LeetCode 394. 字符串解码详解:Java栈实现与逐行解析

给定一个经过编码的字符串,要求将其解码为原始字符串。编码规则为 `k[encoded_string]`,表示方括号内的 `encoded_string` 重复 `k` 次。其中 `k` 为正整数,且输入的字符串保证合法。编码字符串中可能存在多层嵌套括号,例如 `3[a2[c]]` 解码后为 `accaccacc`。**示例**:- 输入:`s = "3[a2[c]]"`- 输出:`"accaccacc"`

2025-05-18 12:07:51 379

原创 LeetCode 155. 最小栈:Java 双栈解法详解

设计一个支持 `push`、`pop`、`top` 操作,并能在 **常数时间** 内检索到最小元素的栈。要求所有操作的时间复杂度均为 O(1)。

2025-05-18 11:41:43 414

原创 Java中Deque与Stack的深度对比:为何官方推荐用Deque替代Stack?

在Java中,栈(Stack)是一种典型的“后进先出”(LIFO)数据结构,常用于实现撤销操作、函数调用栈等场景。尽管Java早期提供了`Stack`类,但官方文档中明确指出应优先使用`Deque`接口实现栈结构。本文将深入对比`Deque`与`Stack`的设计、性能、使用场景及最佳实践,帮助开发者理解两者的核心差异。

2025-05-18 11:15:59 919

原创 LeetCode34. 在排序数组中查找元素的第一个和最后一个位置 | 双二分法高效解法

给定一个按照升序排列的整数数组 `nums` 和一个目标值 `target`,要求找到目标值在数组中的开始位置和结束位置。如果数组中不存在目标值,则返回 `[-1, -1]`。要求算法的时间复杂度为 **O(log n)**。

2025-05-18 10:00:00 252

原创 LeetCode 153. 寻找旋转排序数组中的最小值:二分查找法详解及高频疑问解析

已知一个长度为 `n` 的**旋转排序数组**(例如原数组 `[0,1,2,4,5,6,7]` 旋转后可能变为 `[4,5,6,7,0,1,2]`),要求以 `O(log n)` 的时间复杂度找到数组中的最小值。

2025-05-17 22:28:44 965

原创 LeetCode 33. 搜索旋转排序数组:二分查找的边界艺术

在旋转后的有序数组中搜索目标值。假设数组原本按升序排列,但在某个未知下标处进行了旋转(例如 `[0,1,2,4,5,6,7]` 旋转后可能变为 `[4,5,6,7,0,1,2]`)。要求时间复杂度为 **O(log n)**。

2025-05-17 22:07:21 568

原创 Java 常见数据结构操作详解:获取长度与删除元素

在后端开发及算法面试中,熟练掌握数据结构的基础操作(如获取长度、删除元素)是必备技能。本文通过 **代码示例** 和 **表格总结** ,详细讲解 Java 中常用数据结构的相关操作,帮助开发者快速掌握核心知识点。

2025-05-17 11:34:45 389

原创 用Java实现单词搜索(LeetCode 79)——回溯算法详解

给定一个 `m x n` 的二维字符网格 `board` 和一个字符串 `word`,要求判断 `word` 是否存在于网格中。单词必须通过**相邻单元格内的字母按顺序连接形成**,其中“相邻”单元格指的是水平或垂直相邻的单元格。同一个单元格内的字母**不允许被重复使用**。

2025-05-17 09:45:00 926

原创 使用回溯算法生成有效括号组合的实现详解LeetCode22

**括号生成问题**要求生成所有由 `n` 对有效括号组成的字符串组合。例如,当 `n = 3` 时,可能的组合包括 `"((()))"`, `"(()())"`, `"()(())"`, `"()()()"` 等。有效括号需满足以下条件:- 每个左括号必须有对应的右括号。- 括号顺序必须正确(例如 `")("` 是无效的)。

2025-05-17 08:00:00 1030

原创 解决LeetCode 47. 全排列 II 问题的正确姿势:深入分析剪枝与状态跟踪

给定一个可能包含重复元素的整数数组 `nums`,返回所有可能的唯一全排列。例如,输入 `nums = [1,1,2]`,期望输出为: `[[1,1,2], [1,2,1], [2,1,1]]`。

2025-05-16 19:36:41 713

原创 Java回溯算法解决非递减子序列问题(LeetCode 491)的深度解析

给定一个整数数组 nums,要求找出所有不同的非递减子序列,子序列至少包含两个元素。原代码存在两个主要问题:非递减条件错误和缺少去重逻辑

2025-05-16 17:35:55 928

原创 LeetCode 39 & LeetCode 40 组合总和问题详解:回溯算法与剪枝优化(Java实现)

本文解析了组合总和问题的两个变体:组合总和I和组合总和II。组合总和I要求从无重复元素的数组中找到和等于目标的组合,允许重复使用元素;组合总和II则针对可能包含重复元素的数组,且每个元素在每个组合中只能使用一次。通过回溯算法,结合排序剪枝和去重处理,可以有效解决这两个问题。文章详细介绍了代码实现、复杂度分析及关键点解析,帮助读者理解剪枝与去重的原理,并提供了常见问题的解答,便于举一反三处理类似问题。

2025-05-10 17:45:02 648

原创 LeetCode 216.组合总和 III:回溯算法实现与剪枝优化

回溯法的适用性:适合解决组合、排列、子集等问题,通过递归和剪枝平衡效率。剪枝优化的重要性:合理剪枝可以显著减少无效递归路径。扩展问题组合总和 I(数字可重复使用)组合总和 II(包含重复数字但不可重复使用)核心收获:通过升序选择数字避免重复,通过预计算最大起始值减少无效遍历。

2025-05-08 18:07:21 354

原创 LeetCode77. 组合问题详解:Java回溯算法+剪枝优化实现

核心技巧:回溯算法的路径管理 + 数学剪枝。相似题目LeetCode39. 组合总和LeetCode46. 全排列练习建议:尝试修改代码输出含重复元素的组合(如LeetCode40. 组合总和 II。

2025-05-08 14:40:59 807

原创 如何高效实现「LeetCode25. K 个一组翻转链表」?Java 详细解决方案

通过虚拟头节点、指针定位和分组断链,本方案高效实现了链表的每k个节点翻转。代码逻辑清晰,时间复杂度为线性,适合处理大规模链表数据。

2025-05-07 17:56:13 482

原创 LeetCode21.合并有序链表全解析:从两链表到K链表的算法优化

合并两个链表时优先使用迭代法保证稳定性递归法可用于代码简洁性优先的场景合并K个链表时默认使用分治法(LeetCode官方推荐解法)当K较小时(如K≤10),优先队列法更易实现注意事项始终检查输入链表数组为空的情况处理链表节点时注意断链操作附录:LeetCode测试用例验证空链表输入单链表输入超长链表(10^4级别节点)大规模链表数(K=10^4)掌握这些核心方法,将能从容应对绝大多数链表合并相关的算法挑战!

2025-05-07 08:00:00 1013

原创 LeetCode 148. 排序链表:归并排序的细节解析

均匀分割的重要性:确保递归深度为O(log n),避免时间复杂度退化。快慢指针的初始化细节保证了链表被均匀分割,尤其是在链表长度为偶数时。归并排序的优势:适合链表的顺序访问特性,合并操作无需额外空间(仅需修改指针)。通过正确实现快慢指针的分割逻辑,归并排序能够高效解决链表的排序问题,满足题目对时间复杂度和空间复杂度的要求。

2025-05-07 08:00:00 273

原创 LeetCode 54.螺旋矩阵遍历的两种方法详解与对比

边界调整法适合实际应用场景,尤其是大规模矩阵遍历。通过逐层收缩边界,时间和空间复杂度均最优。矩阵旋转法适合理解螺旋遍历的逻辑本质,但时间和空间开销较大,仅推荐在小规模数据或教学场景使用。两种方法各有优劣,开发者可根据具体需求选择实现方式。若追求性能,优先选择边界调整法;若需快速验证逻辑,可尝试矩阵旋转法。

2025-05-06 18:36:43 318

原创 深入解析二维矩阵搜索:LeetCode 74与240题的两种高效解法对比

尽管题目名称相似,但它们的矩阵排序规则和解题思路存在显著差异。本文将从问题本质出发,对比两种解法的核心思想、适用场景及实现细节,帮助读者深入理解并灵活应对类似问题。通过深入理解矩阵的排序规则与算法特性,读者可以灵活选择最优解法,轻松应对二维矩阵搜索问题。无论是面试还是实际工程应用,清晰的思路和高效的代码实现都是解决问题的关键。(O(\log(m \times n))),其中 (m) 为行数,(n) 为列数。(O(m + n)),其中 (m) 为行数,(n) 为列数。

2025-05-06 17:10:41 1555

原创 LeetCode 239. 滑动窗口最大值(Java)——双端队列高效解法

通过双端队列维护单调性,我们能够高效地解决滑动窗口最大值问题。该方法的核心在于利用队列的单调性减少不必要的比较,从而将时间复杂度优化至O(n)。理解队列维护的条件(何时移除元素)是掌握此算法的关键。

2025-05-06 08:00:00 731

原创 经典算法实战:环形链表的检测、入口定位与重复数查找(LeetCode 141, 142, 287)

环形链表问题是数据结构与算法中的经典问题,常见于面试与竞赛场景。本文通过**快慢指针法**(Floyd判圈算法)深入解析以下三个问题

2025-05-06 08:00:00 924

原创 41.寻找缺失的第一个正数:原地哈希算法详解

原地哈希算法通过索引映射和元素交换,将时间复杂度优化至O(n),空间复杂度优化至O(1)。该方法不仅高效,还能帮助深入理解数组索引与数值之间的关系。掌握这一算法,可轻松应对类似的高频面试题。

2025-05-05 14:39:23 482

原创 LeetCode 238:除自身以外数组的乘积(Java实现)

通过两次遍历分别计算左右两侧的乘积,既避免了除法,又优化了空间复杂度。该方法适用于需要前后缀计算的场景(如“接雨水”问题)。关键在于分步拆解问题,复用结果数组减少空间占用。

2025-05-05 14:14:30 855

原创 原地轮转数组的两种高效实现详解

临时数组法优点:逻辑直观,代码简单。缺点:需额外空间存储k个元素。三次反转法优点:原地操作,空间最优。缺点:需熟悉反转逻辑,索引处理需谨慎。根据实际场景选择合适的方法,若内存允许且追求代码简洁性,可选用临时数组法;若需严格原地操作,三次反转法是更优选择。

2025-05-02 18:17:53 708

原创 Java实现区间合并算法详解

排序是核心:排序后,只需线性遍历即可合并相邻重叠区间。合并逻辑:比较当前区间与合并列表最后一个区间,动态更新结束点。Java类型转换:通过toArray指定返回数组类型,避免类型安全问题。扩展思考:如果输入区间已经按起始点排序,如何优化算法?此时时间复杂度可降至O(n)!

2025-05-02 17:02:29 446

原创 最大子数组和问题:两种Kadane算法实现对比与优化详解

算法选择:Kadane算法是解决最大子数组和问题的最优解实现差异显式条件分支更易理解算法本质Math.max实现更简洁优雅工程实践优先使用标准Math.max实现注意变量命名的语义化避免冗余的边界检查。

2025-05-02 16:19:52 514

原创 LeetCode 560. 和为 K 的子数组 | 前缀和与哈希表的巧妙应用

前缀和与哈希表的结合是解决子数组和问题的经典方法,适用于大规模数据。初始化哈希表为{0:1}是关键,确保能正确统计到从数组起始位置开始的子数组。通过空间换时间,将时间复杂度从 O(n²) 优化到 O(n)。

2025-05-02 15:12:23 540

原创 LeetCode路径总和系列问题解析:I、II、III的解决方案与优化

问题核心方法时间复杂度空间复杂度关键难点路径总和 I递归遍历O(n)O(n)终止条件判断路径总和 II回溯+路径记录O(n)O(n²)深拷贝与回溯逻辑路径总和 III前缀和+哈希表O(n)O(n)前缀和统计与回溯维护路径总和I:基础递归应用,理解终止条件与递归分解。路径总和II:掌握回溯法维护路径状态,注意深拷贝避免引用问题。路径总和III:前缀和优化是核心,通过空间换时间避免重复计算。

2025-04-30 16:43:26 664

原创 从遍历序列构造二叉树:前序+中序与中序+后序的递归解法详解

核心共性通过根节点分割中序序列,确定左右子树的区间。递归处理左右子树时,需精准计算前序或后序序列的子树区间。关键区别根节点位置:前序序列首元素 vs. 后序序列末元素。区间计算:前序需跳过根节点后分割,后序需排除末元素后分割。扩展思考如何验证构建的二叉树是否正确?重新生成前序/中序/后序遍历序列,与原输入比对。如果遍历序列中存在重复值,上述方法是否有效?无效,因为哈希表无法唯一确定根节点位置。题目链接105. 从前序与中序遍历序列构造二叉树106. 从中序与后序遍历序列构造二叉树。

2025-04-29 18:50:15 752

原创 如何将二叉树展开为链表?两种Java实现方法对比

通过修改指针实现原地展开,无需额外空间。类似Morris遍历,时间复杂度O(n),空间复杂度O(1)。:显式存储前序遍历结果,再重建链表。时间复杂度O(n),空间复杂度O(n)。的顺序展开为一个单链表。给定一棵二叉树的根节点 `root``,要求将其按。

2025-04-29 16:57:47 681

原创 链表反转操作经典问题详解

反转链表:迭代法(O(1) 空间)和递归法(O(n) 空间)各有适用场景。回文链表:结合快慢指针和反转链表,实现 O(1) 空间复杂度。区间反转:通过哑节点和精准定位,高效处理子链表反转。核心技巧双指针法(快慢指针、前后指针)哑节点简化边界条件递归与回溯的灵活应用通过练习这些经典问题,可以深入掌握链表操作的核心逻辑!

2025-04-29 16:00:10 731

原创 链表相交节点与最小索引和问题的解法详解

相交链表问题:通过双指针法消除长度差异,实现高效相遇检测。最小索引和问题:利用哈希表快速查找共同元素,动态维护最小索引和。核心思想:双指针法适用于链表遍历问题,哈希表适用于快速查找和索引维护。

2025-04-29 12:34:35 719

原创 二叉搜索树中第 K 小的元素:两种方法详解(递归与迭代)

特性递归实现迭代实现代码简洁性更简洁,无需显式栈操作需要手动维护栈结构空间风险树高度较大时可能栈溢出显式栈更稳定适用场景树高度较小或 k 较小树高度较大或需要避免递归风险推荐选择若对代码简洁性要求高且树高度可控,优先选择递归。若树高度较大或需要严格避免栈溢出风险,选择迭代实现。

2025-04-29 08:00:00 526

三级数据库无纸化考试模拟软件.rar

一个计算机三级数据库的模拟软件,上传于此是为了个人备份

2019-08-29

空空如也

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

TA关注的人

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