自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(398)
  • 收藏
  • 关注

原创 算法题 最多能完成排序的块

这篇技术文章探讨了如何将特定排列的数组分割成最多可排序块的问题。文章提出了三种解决方案: 贪心分割法:通过遍历数组并维护当前最大值,当最大值等于当前索引时进行分割。时间复杂度O(n),空间复杂度O(1)。 优化版:增加提前判断数组是否有序的优化。 栈模拟法:使用栈来直观地模拟分割过程,逻辑更清晰但空间复杂度较高。 文章详细分析了算法思路,包括关键条件(max(arr[0..i]) == i时进行分割),并通过示例演示了算法过程。同时提供了多种测试用例验证算法的正确性。最终推荐使用贪心分割法作为最优解决方案,

2025-09-02 11:15:56 75

原创 算法题 托普利茨矩阵

托普利茨矩阵判断算法 摘要:本文介绍了判断矩阵是否为托普利茨矩阵的两种解法。托普利茨矩阵要求每条由左上到右下的对角线上元素相同。方法一通过逐元素检查其右下角元素是否相等,时间复杂度O(m×n),空间复杂度O(1)。方法二按对角线遍历验证。两种方法本质相同,但方法一更简洁高效。文章包含详细算法思路、代码实现、测试用例和关键点分析,适用于处理各种矩阵大小和边界情况。

2025-09-02 10:54:17 159

原创 算法题 打开转盘锁

摘要 本文介绍了解决"打开转盘锁"问题的两种BFS算法。问题要求在避开死亡数字的情况下,找到从"0000"到目标数字的最短路径。标准BFS解法从起点出发,逐层搜索所有可能的8种旋转操作(4位×2方向),使用队列和哈希集合记录访问状态。更优的双向BFS同时从起点和终点搜索,当两个方向相遇时返回结果。两种方法都处理了边界情况,如初始状态即目标或死亡数字。核心思想是将问题建模为图的最短路径问题,通过状态空间搜索找到最优解。

2025-09-02 10:25:34 327

原创 算法题 至少是其他数字两倍的最大数

算法题 至少是其他数字两倍的最大数

2025-09-01 16:37:20 385

原创 算法题 寻找比目标字母大的最小字母

算法题 寻找比目标字母大的最小字母

2025-09-01 15:58:52 420

原创 算法题 删除并获得点数

删除并获得点数算法摘要 给定一个整数数组,通过删除元素获得点数。删除一个元素时,必须同时删除其相邻元素(值±1)。目标是通过一系列删除操作获得最大点数。 关键思路 转化为"打家劫舍"问题:将数字及其总和统计,转化为不能选择相邻元素的问题 使用动态规划求解:dp[i]表示处理到数字i时的最大点数 状态转移方程:dp[i] = max(dp[i-1], dp[i-2] + points[i]) 算法实现 统计每个数字的总点数(数字×频次) 动态规划处理从1到最大数字的序列 空间优化:仅使用两

2025-08-30 10:57:17 490

原创 算法题 每日温度

本文介绍了如何解决"每日温度"问题,即计算每天之后需要等待多少天才能遇到更暖和的天气。核心解法是使用单调栈,维护一个温度递减的索引栈,当遇到更高温度时弹出栈顶元素并计算等待天数。提供了三种实现方法:1)标准单调栈法;2)数组模拟栈优化;3)反向遍历跳跃法。时间复杂度均为O(n),空间复杂度从O(n)到O(1)不等。通过示例详细演示了算法过程,并给出了测试用例验证正确性。该问题典型应用了单调栈思想,适合处理"下一个更大元素"类问题。

2025-08-30 10:25:27 538

原创 算法题 图像渲染

本文介绍了图像渲染问题的DFS和BFS解法。题目要求从指定像素开始,将与起始像素颜色相同且连通的区域渲染为新颜色。DFS递归解法通过深度优先搜索遍历连通区域;BFS迭代解法使用队列实现广度优先搜索;DFS显式栈解法避免了递归的栈溢出风险。所有解法的时间复杂度均为O(mn),空间复杂度为O(mn)(最坏情况下)。关键点在于检查边界条件和防止重复处理,当起始颜色与目标颜色相同时可直接返回原图。

2025-08-30 09:51:26 323

原创 算法题 寻找数组的中心下标

本文介绍了如何寻找数组的中心下标,即左侧元素和等于右侧元素和的下标。主要采用前缀和优化法,通过计算总和并维护左侧和来高效求解。算法时间复杂度O(n),空间复杂度O(1)。关键点在于利用数学关系leftSum == totalSum - leftSum - nums[i]避免重复计算。文章提供了多种实现方法、详细算法分析和测试用例,特别适合需要高效解决此类问题的场景。

2025-08-29 11:10:44 344

原创 算法题 词典中最长的单词

文章摘要 该问题要求在给定词典中找出最长的单词,该单词的所有前缀都必须存在于词典中。推荐解法是排序+集合查找:首先将单词按长度和字典序排序,然后遍历检查每个单词的前缀是否都在集合中,动态维护有效单词集合和最长单词。另一种解法使用Trie树,适合大量单词场景。时间复杂度为O(nlogn)或O(n*L),空间复杂度为O(n)。关键点在于理解逐步添加字母的规则,确保每个前缀都有效。

2025-08-29 10:43:02 638

原创 算法题 1 比特与 2 比特字符

摘要:题目判断二进制数组能否以单比特字符0结尾。两种特殊字符:0(单比特)和10/11(双比特)。解法采用贪心策略从左到右遍历:遇0前进1位,遇1前进2位。若最后停在倒数第二位,则最后一个0可单独解码。时间复杂度O(n),空间复杂度O(1)。逆向遍历法通过统计末尾1的奇偶性判断更高效。递归解法虽直观但效率低。关键点在于编码规则无歧义,解码方式唯一。

2025-08-29 10:11:46 270

原创 算法题 乘积小于 K 的子数组

文章摘要: 本文介绍了解决"乘积小于K的子数组个数"问题的多种方法。核心解法是滑动窗口法,通过维护双指针[left, right]窗口,动态调整边界并计算满足条件的子数组数量。关键点在于:对于每个右边界,以right结尾的有效子数组数量为right-left+1。文章提供了三种实现方案:1)标准滑动窗口法(O(n)时间);2)优化版处理边界情况;3)暴力解法(O(n²)时间)。示例分析展示了算法的执行过程,并附有测试用例验证。该算法适用于正整数数组,高效计算乘积小于阈值的所有连续子数组数

2025-08-28 11:21:51 395

原创 算法题 二分查找

二分查找是一种在有序数组中高效查找目标值的算法,时间复杂度为O(log n)。给定升序数组nums和目标值target,算法通过维护搜索区间[left, right],每次比较中点值nums[mid]与target,将搜索空间减半。若找到目标则返回下标,否则返回-1。文章提供了三种实现方式:标准迭代法、递归法和使用位运算优化的版本。标准解法初始化搜索区间为[0, n-1],通过循环计算中点mid,比较后调整区间边界,直到找到目标或区间无效。测试用例验证了不同场景下的正确性,包括目标存在、不存在、边界位置等情

2025-08-28 10:29:40 257

原创 算法题 数组的度

摘要 本文研究了如何找到与给定数组具有相同度的最短连续子数组的问题。数组的度定义为元素出现的最大频次。我们提出了三种解决方案: 哈希表记录法:通过一次遍历记录每个元素的频次、首次和最后出现位置,然后计算最小跨度。时间复杂度O(n),空间复杂度O(n)。 优化单次遍历法:在遍历过程中实时更新最大度和最小长度,进一步优化性能。 独立哈希表法:使用三个独立哈希表分别记录频次、首次和最后位置,逻辑更清晰。 核心思想是度最大的元素决定了子数组的度,要找到这些元素的最短出现区间。该算法能高效解决问题,适用于大规模数据。

2025-08-28 09:53:28 285

原创 算法题 数组能形成多少数对

本文介绍了计算数组中可形成数对数量及剩余元素数的算法。通过哈希表统计各数字频次,计算出可移除的配对次数和剩余元素数。算法时间复杂度为O(n),适用于不同数据范围。文章提供了三种实现方法:哈希表计数、数组计数和一次遍历优化,并包含详细的算法分析、示例解析和测试用例验证。该问题采用贪心策略,独立计算各数字的配对贡献,具有明确的数学规律。

2025-08-27 16:03:39 261

原创 算法题 前K个高频单词

本文介绍了三种方法解决前K个高频单词问题:1)最小堆解法,通过哈希表统计频率,用最小堆维护前k个高频词;2)最大堆解法,将所有单词放入堆后取前k个;3)桶排序解法,按频率分桶后从高到低收集。核心思路是优先处理高频词,频率相同时按字典序排序。最小堆解法时间复杂度O(nlogk)最优,适用于大规模数据;桶排序解法时间复杂度O(n)但空间复杂度较高。

2025-08-27 15:13:19 997

原创 算法题 员工的重要性

本文介绍了如何计算员工及其下属的总重要性。给定员工列表和目标ID,通过图的遍历(BFS或DFS)累加该员工及其所有下属的重要性值。BFS使用队列实现层次遍历,而DFS可采用递归或栈迭代方式。核心步骤包括:1) 构建员工哈希表;2) 从目标员工开始遍历;3) 累加所有访问员工的重要性。时间复杂度O(n),空间复杂度O(n),n为员工数量。

2025-08-27 14:38:58 940

原创 算法题 棒球比赛

摘要 该问题要求实现一个棒球比赛记分系统,处理四种操作:整数得分、"+"(前两轮得分和)、"D"(前一轮得分双倍)和"C"(取消前一轮得分)。使用栈数据结构能高效解决:遍历操作数组,遇到数字直接入栈;"+"取栈顶两个元素求和后入栈;"D"取栈顶元素双倍后入栈;"C"弹出栈顶元素。最后求栈中所有元素的和即为总得分。时间复杂度O(n),空间复杂度O(n)。问题考察栈的应用和基本操作实现。

2025-08-26 11:38:29 762

原创 算法题 连续字符

算法题 连续字符

2025-08-26 11:06:10 403

原创 算法题 最长连续递增序列

这篇文章介绍了如何寻找数组中"最长连续递增序列"的问题。主要提供了三种解法: 一次遍历法:通过单次扫描数组,维护当前连续递增序列的长度,遇到递增中断时重置并更新最大值。时间复杂度O(n),空间复杂度O(1),是最推荐的解法。 双指针滑动窗口法:使用左右指针标记递增序列的起止位置,逻辑清晰但略微复杂。同样具有O(n)时间复杂度和O(1)空间复杂度。 动态规划法:定义dp[i]为以nums[i]结尾的最长连续递增序列长度,虽然展示了动态规划思想,但需要O(n)额外空间。 文章通过具体示例演示

2025-08-26 10:40:02 256

原创 算法题 优美的排列

摘要:本文介绍了求解"优美的排列"问题的算法。给定1到N的整数,要求统计满足特定条件的排列数量:每个位置i的数字必须能被i整除或i能被该数字整除。文章提供了三种解法:1)标准回溯法,通过深度优先搜索生成排列并在过程中剪枝;2)预处理优化法,预先计算每个位置可放置的数字;3)位掩码优化法,使用整数位表示状态并配合记忆化搜索。核心思路是通过回溯法构建排列,同时利用剪枝和预处理技术提高效率。示例代码展示了Java实现,其中回溯法通过标记数组跟踪数字使用状态,并递归尝试所有有效组合。

2025-08-26 09:55:50 219

原创 算法题 非递减数列

摘要 本文讨论了如何判断一个整数数组能否通过最多修改一个元素变成非递减数列。给出了三种解决方法: 贪心修复法:遍历数组时,遇到违规位置尝试两种修复策略(修改当前或下一个元素),根据前后关系决定最优修改方式。最多只允许一次修改。 简化方法:不实际修改数组,通过模拟修改过程来判断可行性。 两次遍历法:先找到第一个违规位置,然后分别尝试修改该位置或下一个位置,验证是否能修复整个数组。 核心思想是通过局部调整来处理违规情况,同时确保全局仍保持非递减性质。时间复杂度为O(n),空间复杂度O(1)。

2025-08-25 16:36:39 839

原创 算法题 分割数组为连续子序列

摘要 该问题要求将已排序的整数数组分割为多个长度≥3的连续子序列。采用贪心算法结合哈希表的解决方案: 使用两个哈希表分别记录数字剩余频次和子序列需求 遍历数组时,优先将数字连接到已有子序列末尾 无法连接时则尝试创建新子序列(需保证后续两个连续数字存在) 优化版本使用数组代替哈希表提升效率 算法核心在于优先延长现有子序列,保留分割灵活性。时间复杂度O(n),空间复杂度O(n),能有效判断是否满足分割条件。

2025-08-25 15:40:55 1284

原创 算法题 第一个错误的版本

摘要:这个问题要求使用二分查找算法在n个版本中找出第一个错误的版本,以减少API调用次数。关键思路是利用版本有序的特性,当中间版本错误时,搜索左半部分;否则搜索右半部分。标准解法采用迭代二分查找,时间复杂度为O(log n),空间复杂度O(1)。递归实现和边界处理优化也提供了可选方案。测试案例验证了算法在不同场景下的正确性,包括单版本、第一个/最后一个版本错误等特殊情况。

2025-08-25 15:01:32 836

原创 算法题 猜数字大小

摘要:本文介绍了"猜数字大小"问题的二分查找解法。给定1到n的范围,通过调用guess API判断猜测数字与目标数字的关系,使用二分查找策略在O(log n)时间内找到目标数字。核心算法包括初始化搜索区间、计算中点、根据API结果调整范围,直到猜中为止。提供了标准迭代、递归和优化三种实现方式,并分析了时间/空间复杂度及API调用次数。关键点包括避免整数溢出、正确的循环条件和边界更新策略,确保算法高效可靠。

2025-08-23 10:45:38 553

原创 算法题 找到 K 个最接近的元素

这篇文章介绍了在已排序数组中查找最接近给定值x的k个元素的算法。主要内容包括: 问题描述:给定已排序数组arr、整数k和x,找出最接近x的k个数,并按序返回 三种解法: 双指针滑动窗口法:维护k大小的窗口,比较边界距离收缩窗口 二分查找+双指针优化:先二分定位x位置,再双指针确定窗口 纯二分查找最优解:直接二分查找窗口起始位置 关键点: 距离相等时优先取较小值 边界条件处理(k>=数组长度) 时间复杂度从O(n)优化到O(log n + k) 代码实现:提供了Java版本的三种方法实现,包括详细注释

2025-08-23 10:10:53 314

原创 算法题 最大二叉树

654. 最大二叉树 - 摘要 本题要求根据不含重复元素的整数数组构建一棵最大二叉树。构建规则为:根节点为数组最大值,左子树由最大值左侧子数组构建,右子树由右侧子数组构建。 关键算法: 递归分治法(推荐解法): 时间复杂度:O(n²)最坏情况,平均O(n log n) 空间复杂度:O(n) 步骤:找最大值→创建根节点→递归构建左右子树 优化解法: 预处理最大值索引表,避免重复查找 适合高频查询场景 示例解析: 输入[3,2,1,6,0,5]构建的树形结构为: 6 / \ 3 5 \ \ 2 0 \ 1 实现

2025-08-23 09:45:09 629

原创 算法题 实现 Trie (前缀树)

Trie(前缀树)是一种高效存储和检索字符串的数据结构,核心在于多叉树结构(每个节点26个子节点对应a-z)和isEnd标记位。主要操作包括:insert(word)逐字符创建节点并标记结束,search(word)检查路径存在且isEnd为true,startsWith(prefix)只需路径存在。时间复杂度均为O(m)(m为字符串长度),空间复杂度为O(26NM)。关键点在于isEnd标记区分路径存在和完整单词存在,使Trie能高效处理字符串匹配和前缀查询。

2025-08-22 11:35:11 396

原创 算法题 单词替换

本文提出了一种使用前缀树(Trie)高效替换句子中继承词的方法。算法首先构建词典词根的前缀树,然后对句子中的每个单词查找最短匹配词根进行替换。示例展示了如何将"the cattle was rattled by the battery"替换为"the cat was rat by the bat"。该算法时间复杂度为O(m+n×l),其中m是词根总长度,n是单词数,l是平均单词长度,空间复杂度为O(m)。通过前缀树实现快速查找,确保找到最短词根后立即返回,优化了替换效

2025-08-22 11:07:12 623

原创 算法题 最长数对链

本文介绍了如何求解最长数对链问题。算法采用贪心策略,将数对按右端点排序后,依次选择不与前一个选中数对重叠的数对。该方法时间复杂度为O(n log n),空间复杂度O(1),通过局部最优选择达到全局最优解。文章包含算法思路、实现代码、复杂度分析和测试用例,解释了关键点和常见问题。

2025-08-22 10:15:56 411

原创 算法题 错误的集合

本文介绍了寻找错误集合中重复和缺失数字的算法。给定一个包含1到n数字但存在一个重复和一个缺失的数组,需要返回这两个数字。主要提供了三种解决方案:(1) 数学方法利用求和公式计算;(2) 哈希表统计数字出现频率;(3) 原地修改法将数组本身作为哈希表使用。其中数学方法时间复杂度最优(O(n)),原地修改法空间复杂度最优(O(1))。文章详细说明了每种算法的实现思路、代码示例以及复杂度分析,并通过具体例子演示了算法执行过程,最后给出了测试用例验证算法正确性。

2025-08-22 09:46:48 295

原创 算法题 子数组最大平均数 I

本文介绍了求解子数组最大平均数问题的滑动窗口算法。给定整数数组nums和长度k,算法通过维护固定大小的窗口来高效计算连续子数组最大平均值。关键步骤包括:计算初始窗口和,滑动窗口更新和,并记录最大值。时间复杂度O(n),空间复杂度O(1)。文章提供了Java实现,分析了示例过程,并讨论了边界情况处理、整数溢出预防和精度控制等关键点,最后给出了测试用例和常见问题解答。

2025-08-22 09:24:08 336

原创 算法题 最小高度树

摘要 本文介绍了寻找树的最小高度根节点问题。通过分析树的中心性质,提出了基于拓扑排序的层层剥离算法:从叶子节点开始逐层向内剥离,最终剩下的1-2个节点即为解。算法时间复杂度O(n),空间复杂度O(n)。关键点包括中心节点性质、按层剥离的处理方式以及边界条件处理。测试用例验证了算法的正确性,常见问题部分解答了关于算法原理和实现的疑问。该算法适用于网络中心选择等实际场景。

2025-08-21 11:23:32 1034

原创 算法题 课程表 II

本文介绍了课程表II问题的拓扑排序解法。给定课程数量和先修关系,要求返回可行的学习顺序。主要采用两种方法:Kahn算法(BFS)统计入度并处理入度为零的节点,以及DFS三色标记法检测环并进行后序遍历。两种方法的时间复杂度均为O(V+E),其中V是课程数,E是先修关系数。当图中存在环时返回空数组,否则返回拓扑排序结果。示例展示了如何将课程关系建模为有向图,并通过BFS逐步处理节点得到正确顺序[0,1,2,3]或[0,2,1,3]。

2025-08-21 10:43:56 631

原创 算法题 三个数的最大乘积

摘要:该算法用于计算数组中三个数的最大乘积,通过排序或线性扫描找出关键数值。核心思路是两种可能情况:三个最大正数的乘积,或两个最小负数与一个最大正数的乘积。排序法时间复杂度O(n log n),优化版仅需O(n)时间。关键点在于处理负数时"负负得正"的情况,以及数学证明最优解必然来自这两种组合。算法简洁高效,适用于各种输入情况。

2025-08-20 11:31:26 334

原创 算法题 数组列表中的最大距离

本文提出了一种解决多个升序数组中选取元素使最大差值最小化的问题。算法通过贪心策略,在遍历数组时维护全局最小值和最大值,计算当前数组与之前数组的最大距离。时间复杂度为O(m),空间复杂度O(1),适用于处理大规模数据。测试用例验证了算法在不同场景下的正确性,包括负数、相同值和单元素数组等情况。关键点在于理解最大距离必然来自不同数组的最值组合,通过一次遍历即可高效求解。

2025-08-20 10:54:33 386

原创 算法题 设计循环队列

本文介绍了循环队列的设计与实现。使用数组和双指针(front/rear)实现循环机制,通过取模运算处理指针移动。关键点包括:预留一个空位区分队列空/满状态,空时front=rear,满时(rear+1)%capacity=front。所有操作均为O(1)时间复杂度,空间复杂度O(k)。测试用例验证了队列的基本操作和边界情况。该方法高效实现了循环队列的插入、删除等操作。

2025-08-20 10:33:19 373

原创 算法题 任务调度器

本文介绍了CPU任务调度问题的解法,关键在于计算完成所有任务所需的最短时间。通过分析任务频率和冷却时间,使用桶模型计算理论最小值:(最大频率-1)*(冷却时间+1)+同频任务数。最终结果取该值与任务总数的较大者。算法时间复杂度O(m),空间复杂度O(1)。提供了Java实现代码和多个测试用例,包括标准情况、无冷却、长冷却等边界条件,确保算法正确性。核心思路是优先调度高频任务,通过数学计算避免模拟调度的复杂度。

2025-08-20 09:49:22 321

原创 算法题 有效三角形的个数

摘要 本文介绍了LeetCode 611题"有效三角形的个数"的解决方案。给定非负整数数组,计算能构成有效三角形的三元组数量。关键算法采用排序预处理和双指针优化:首先将数组升序排列,然后固定最长边,用双指针在左侧查找满足两边之和大于最长边的组合。时间复杂度为O(n²),空间复杂度O(1)。算法通过排序后验证单个不等式并利用双指针移动策略高效统计有效组合,避免了暴力解法的O(n³)复杂度。文中包含详细代码实现、算法分析、测试用例和关键点说明,特别强调了排序后只需验证一个不等式的数学原理。

2025-08-19 11:28:45 817

原创 算法题 小行星碰撞

本文介绍了一个解决小行星碰撞问题的栈模拟算法。给定表示小行星大小和方向的数组,当左右行星相向而行时会碰撞,较小者爆炸。算法使用栈结构模拟碰撞过程:遍历数组,遇到向右行星直接入栈;遇到向左行星时与栈顶向右行星比较大小,决定谁爆炸。时间复杂度O(n),空间复杂度O(n)。关键点包括正确判断碰撞条件、处理大小比较以及栈的顺序特性。测试用例验证了算法对标准情况、同大小碰撞、连续碰撞等场景的正确性。该算法高效处理了行星碰撞问题,确保最终结果按正确顺序返回。

2025-08-19 10:53:36 961

空空如也

空空如也

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

TA关注的人

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