- 博客(655)
- 收藏
- 关注
原创 算法题 最大宽度坡
本文介绍了求解数组中最大宽度坡的两种方法。暴力法通过双重循环检查所有可能的坡,时间复杂度为O(n²)。优化方法使用单调栈存储候选左端点,并从右向左遍历寻找右端点,时间复杂度降为O(n)。关键点在于利用单调栈的递减特性过滤无效左端点,再通过贪心策略快速定位最佳右端点。测试用例验证了算法在多种情况下的正确性,包括严格递增/递减数组和全等数组等边界情况。该算法有效解决了大规模数据下的坡查找问题。
2026-01-20 16:06:52
808
原创 算法题 在长度 2N 的数组中找出重复 N 次的元素
摘要:本文探讨了在长度为2N的数组中找出重复N次的元素的问题。介绍了两种解法:哈希表计数法(时间O(N),空间O(N))和间隔检查法(时间O(N),空间O(1))。重点分析了间隔法的数学原理,证明重复元素必然出现在特定间隔内。提供了Java实现代码和测试用例,验证了算法的正确性。关键点在于利用数组结构特性优化查找效率,适用于大规模数据处理。
2026-01-20 15:50:33
265
原创 算法题 二叉树的完全性检验
本文介绍了如何判断二叉树是否为完全二叉树。完全二叉树的定义是除最后一层外所有层都被填满,且最后一层结点从左向右连续排列。文章提供了两种算法:1) 层序遍历(BFS),遇到第一个空节点后检查后续节点是否全为空;2) 节点编号法,验证节点编号是否连续。两种方法的时间复杂度均为O(n),空间复杂度为O(w)。通过示例[1,2,3,4,5,null,7]详细演示了算法执行过程,并给出了Java实现代码和测试用例。
2026-01-20 15:39:41
408
原创 算法题 验证外星语词典
摘要: 题目要求验证给定单词数组是否按照外星字母表顺序排列。通过建立字符到顺序的映射,然后逐对比较相邻单词。比较时从左到右检查第一个不同字符的顺序关系,若全相同则较短的单词应排在前面。算法时间复杂度为O(C)(C为所有单词字符总数),空间复杂度O(1)。测试用例验证了前缀、逆序、相同单词等边界情况,确保算法正确性。
2026-01-16 16:37:05
313
原创 算法题 翻转等价二叉树
摘要 本题判断两棵二叉树是否可通过翻转节点(交换左右子树)变为等价。核心思路是递归比较:若两树根节点值相同,则检查其子树是否直接匹配或翻转后匹配。算法时间复杂度为O(min(N1,N2)),空间复杂度为O(min(H1,H2))。示例中,树1通过翻转节点1、3、5即可与树2一致,返回true。提供三种实现:递归(基础解法)、带剪枝的递归优化以及迭代法(栈模拟递归)。测试用例验证了空树、单节点树及复杂结构的正确性。
2026-01-16 16:04:40
513
原创 算法题 验证栈序列
本文介绍了如何验证一个栈序列是否可以通过给定的入栈和出栈操作得到。通过模拟栈操作,使用辅助栈按顺序入栈,并在每次入栈后循环检查栈顶元素是否匹配出栈序列,从而判断序列是否有效。算法时间复杂度为O(n),空间复杂度为O(n)。关键点在于严格遵循栈的LIFO特性,正确处理边界情况,并通过循环确保连续出栈的可能性。测试用例涵盖了标准有效序列、无效序列、极端情况和复杂场景,验证了算法的正确性。
2026-01-16 10:34:22
396
原创 算法题 使数组唯一的最小增量
本文提出了一种使数组元素唯一的最小增量算法。通过先排序数组,然后采用贪心策略从左到右处理,确保每个元素都大于前一个元素。当遇到重复元素时,计算将其增加到前一个元素+1所需的操作次数。该方法时间复杂度为O(n log n),空间复杂度O(1)。测试用例验证了算法在各种情况下的正确性,包括标准示例、全相同元素、已唯一数组等边界情况。关键点在于排序后贪心处理相邻元素,确保操作次数最少。
2026-01-16 10:23:53
212
原创 算法题 删列造序
摘要:本文介绍了解决字符串数组字典序非递减排列问题的算法。给定由n个等长字符串组成的数组,通过删除最少列数使得剩余字符串按字典序非递减排列。算法核心是逐列检查相邻字符串字符是否满足字典序,统计需要删除的列数。提供了两种实现方法(常规遍历和Stream API),时间复杂度为O(m×n),空间复杂度O(1)。文中包含详细算法分析、示例说明和测试用例,关键点包括字典序比较规则、早期终止优化和边界条件处理。该算法适用于需要保证字符串序列有序性的应用场景。
2026-01-15 16:37:04
388
原创 算法题 增减字符串匹配
摘要: 该问题要求根据由'I'(增加)和'D'(减少)组成的字符串构造一个排列。使用双指针贪心算法,初始时low=0,high=n。遍历字符串时,遇到'I'则取当前最小值(low++),遇到'D'则取当前最大值(high--)。最终将剩余数字填入末尾。该方法保证构造的排列满足所有条件,时间复杂度O(n),空间复杂度O(1)。测试验证表明该算法能正确处理各种输入模式,包括全增、全减和混合情况。
2026-01-15 16:25:03
318
原创 算法题 有效的山脉数组
本文介绍了判断数组是否为有效山脉数组的三种方法。有效山脉数组需满足:长度≥3,存在一个严格递增后严格递减的峰值点。双指针法从两端向中间查找递增/递减终点,单次遍历法先找峰值再验证,状态机法则跟踪上升/下降状态。三种方法时间复杂度均为O(n),空间复杂度O(1)。测试用例验证了算法正确性,包括有效山脉、长度不足、平台相等、单调序列等边界情况。
2026-01-15 10:11:00
303
原创 算法题 二叉搜索树的范围和
二叉搜索树的范围和问题摘要 问题描述:给定二叉搜索树(BST)的根节点和范围[low, high],求BST中所有节点值在该范围内的节点值之和。 关键特性: BST特性:左子树节点值 < 当前节点值 < 右子树节点值 利用BST特性进行剪枝优化: 当前节点值 < low时,跳过左子树 当前节点值 > high时,跳过右子树 解决方案: 递归法(最优): 时间复杂度:平均O(log n),最坏O(n) 空间复杂度:O(h),h为树高 核心逻辑:根据当前节点值与范围的比较决定递归方向 迭
2026-01-15 09:57:26
544
原创 算法题 最短的桥
文章摘要 本文介绍了解决"最短的桥"问题的两种算法。题目要求在n×n的二进制矩阵中找到连接两座岛屿的最短桥梁长度(即最少需要翻转的0的数量)。算法采用DFS/BFS和多源BFS结合的思路:首先找到并标记第一座岛屿,然后从该岛屿边界进行多源BFS扩展,直到遇到第二座岛屿。两种实现方法分别使用DFS+多源BFS和BFS+多源BFS,时间复杂度均为O(n²),空间复杂度O(n²)。该方法有效解决了在二维网格中寻找两个连通分量间最短路径的问题,适用于岛屿类问题的变种。
2026-01-14 16:41:48
514
原创 算法题 最近的请求次数
本文介绍了如何实现一个RecentCounter类来计算最近3000毫秒内的请求次数。使用滑动窗口算法,通过队列存储请求时间戳,每次调用ping(t)时添加新请求并移除过期请求,确保队列中的请求都在[t-3000, t]范围内。该算法的时间复杂度为均摊O(1),空间复杂度为O(W),其中W是窗口内的最大请求数。示例测试展示了算法的正确性,关键点在于利用队列高效维护时间窗口内的请求。
2026-01-14 16:25:05
409
原创 算法题 下降路径最小和
摘要 本文研究了方形矩阵中的下降路径最小和问题。通过动态规划方法,我们实现了三种解决方案:基础DP(O(n²)空间)、滚动数组优化(O(n)空间)和记忆化递归。算法从最后一行开始自底向上计算每个位置到终点的最小路径和,通过比较相邻列的值确定最优路径。示例矩阵[[2,1,3],[6,5,4],[7,8,9]]的最小路径和为13(路径1→4→8)。所有方法的时间复杂度均为O(n²),空间复杂度从O(n²)优化到O(n)。该算法能有效解决类似网格路径优化问题。
2026-01-14 16:14:13
522
原创 算法题 和相同的二元子数组
本文介绍了三种解决二元数组中和为给定目标值的连续子数组数量的方法。问题描述给定一个仅包含0和1的数组nums和整数goal,要求统计非空连续子数组和等于goal的数量。 方法一:前缀和+哈希表(时间复杂度O(n),空间复杂度O(n))通过维护前缀和及其出现次数的哈希表,快速查询满足条件的子数组数量。方法二:滑动窗口(时间复杂度O(n),空间复杂度O(1))利用数组元素特性,通过计算和小于等于goal与goal-1的子数组数量差来得到结果。方法三:暴力法(时间复杂度O(n²))直接枚举所有子数组并计算和。 文
2026-01-13 16:21:51
336
原创 算法题 将字符串翻转到单调递增
本文研究了将二进制字符串转换为单调递增字符串的最少翻转次数问题。提出了两种解法:前缀和法和动态规划法。前缀和法通过预处理计算每个分割点左右的翻转次数,时间复杂度O(n),空间复杂度O(n)。动态规划法维护两个状态变量,分别记录以0或1结尾的最小翻转次数,时空复杂度均为O(n)和O(1)。关键点在于找到最优分割点或状态转移关系,处理边界情况如全0/1字符串。测试用例验证了算法的正确性,两种方法都能有效解决问题,其中动态规划在空间效率上更优。
2026-01-13 16:03:49
294
原创 算法题 按奇偶排序数组 II
摘要: 题目要求将包含等量奇偶数的数组重新排序,使得偶数索引放偶数,奇数索引放奇数。提供四种解法: 双指针原地交换:遍历偶数索引,若发现奇数则与奇数索引的偶数交换(时间复杂度O(n),空间O(1)); 优化双指针:同时移动奇偶指针找错位元素并交换(O(n),O(1)); 额外数组:分离奇偶数后按索引填充(O(n),O(n)); 一次遍历填充:直接计算元素应放位置(O(n),O(n))。示例输入[4,2,5,7]可输出[4,5,2,7]等有效解。
2026-01-13 15:49:00
282
原创 算法题 使括号有效的最少添加
本文介绍了解决"使括号有效的最少添加"问题的两种方法。问题要求计算使括号字符串有效所需添加的最少括号数量。有效括号字符串的条件包括:每个左括号必须有对应的右括号,且左括号在右括号之前。 方法一:计数器法 使用两个计数器:leftNeeded记录需要添加的左括号,rightNeeded记录需要添加的右括号 遍历字符串时,遇到左括号增加rightNeeded,遇到右括号时优先匹配已有的左括号(rightNeeded>0则减1),否则增加leftNeeded 时间复杂度O(n),空间复杂
2026-01-12 16:19:07
492
原创 算法题 完全二叉树插入器
本文介绍了完全二叉树插入器的实现方法。该数据结构支持在完全二叉树中插入新节点并返回父节点值,同时能获取当前树的根节点。核心算法使用BFS队列维护可插入位置:初始化时遍历树找到所有可插入节点存入队列;插入时从队列头部取出父节点,优先插入左子树,若已满则插入右子树并移除该父节点;新节点加入队列尾部。时间复杂度为O(n)初始化和O(1)插入,空间复杂度O(n)。测试用例验证了在不同树结构下的正确插入顺序和完全二叉树性质保持。
2026-01-12 16:07:11
430
原创 算法题 环形子数组的最大和
摘要 本文介绍了解决环形数组最大子数组和问题的两种算法。核心思路是将问题分解为两种情况:非环形情况(使用Kadane算法求最大子数组和)和环形情况(总和减去最小子数组和)。方法一分别计算最大和最小子数组和,方法二通过一次遍历同时计算。算法时间复杂度为O(n),空间复杂度为O(1)。测试用例验证了算法对各种情况的处理能力,包括全负数、全正数、环形最优等特殊场景。关键点在于区分环形与非环形情况,并正确处理全负数数组的边界条件。
2026-01-12 15:54:15
318
原创 算法题 分割数组
文章摘要: 题目要求在整数数组中找到最左边的分割点,使左子数组所有元素≤右子数组所有元素。解法采用两次遍历:第一次从左到右计算每个位置左侧最大值leftMax,第二次从右到左计算右侧最小值rightMin。最后遍历寻找满足leftMax[i]≤rightMin[i+1]的最小i,返回i+1作为左子数组长度。算法时间复杂度O(n),空间复杂度O(n)。测试用例验证了递增、递减、全相同及复杂数组的处理,关键点在于问题转化(左最大≤右最小)和边界条件处理。
2026-01-12 10:43:05
244
原创 算法题 卡牌分组
本文研究了卡牌分组问题,要求判断一副卡牌能否分成若干组,每组至少2张且数字相同。算法核心是计算各数字出现频次的最大公约数,若该数≥2则返回true。提供了两种Java实现:方法一使用HashMap统计频次和欧几里得算法计算GCD;方法二利用Stream API简化代码。时间复杂度为O(n + m log k),空间复杂度为O(m)。测试用例验证了算法的正确性,包括标准示例、无法分组的情况和边界条件。关键点在于理解最大公约数≥2意味着所有频次都能被至少2整除,从而确保分组可行。
2026-01-12 10:20:33
387
原创 算法题 排序数组
本文介绍了三种排序整数数组的算法:快速排序、归并排序和堆排序。快速排序采用三数取中法选择基准元素,并针对小数组使用插入排序优化,平均时间复杂度为O(n log n)。归并排序是稳定排序,时间复杂度稳定为O(n log n),但需要额外空间。堆排序同样是O(n log n)时间复杂度,且为原地排序。每种算法都提供了详细的Java实现代码,包括核心排序逻辑和辅助方法。这些排序方法适用于不同场景,可根据数据特性和需求选择合适的算法。
2026-01-12 10:07:43
265
原创 算法题 最小差值 I
摘要:本文介绍了解决数组最小差值问题的贪心算法。给定整数数组nums和整数k,允许将任一元素替换为[num-k, num+k]范围内的任意整数(至多操作一次),求操作后数组最大值与最小值的最小可能差值。算法通过找到原数组的最大值和最小值,计算调整后的可能差值(max(0, max-min-2*k))。时间复杂度O(n),空间复杂度O(1)。测试用例验证了算法对单元素数组、标准示例、大k值等情况的正确处理。关键点在于贪心策略和边界处理,确保差值为非负值。
2026-01-08 16:16:36
311
原创 算法题 子数组的最小值之和
本文介绍了计算数组所有非空连续子数组最小值之和的算法。通过单调栈高效确定每个元素作为最小值的影响范围,计算其对总和的贡献。 关键点: 使用单调栈分别计算每个元素左右边界 左边第一个小于当前元素的位置 右边第一个小于等于当前元素的位置 贡献度计算公式:arr[i] × (i-left) × (right-i) 算法优化: 方法一:两次遍历分别计算左右边界 方法二:单次遍历在弹出栈时直接计算贡献 复杂度分析: 时间:O(n),每个元素处理一次 空间:O(n),存储栈和辅助数组 示例说明: 输入[3,1,2,4]
2026-01-08 16:03:38
418
原创 算法题 按奇偶排序数组
本文介绍了两种解决"按奇偶排序数组"问题的方法。双指针法通过原地交换实现,时间复杂度O(n),空间复杂度O(1);额外数组法通过两次遍历实现,时间复杂度O(n),但需要额外空间。双指针法更为高效,核心思想是使用左右指针分别寻找错位的奇偶数进行交换。两种方法都能正确解决问题,双指针法在空间效率上更优。文中包含详细的算法步骤、代码实现、测试用例和复杂度分析,适用于需要将数组分为偶奇两部分的场景。
2026-01-08 15:50:42
513
原创 算法题 水果成篮
摘要: 该问题要求在最多包含两种水果类型的连续子数组中找出最大长度。采用滑动窗口+哈希表策略:右指针扩展窗口并记录水果计数,当种类超过2时收缩左边界直至满足条件。时间复杂度O(n),空间复杂度O(1)。示例表明算法能正确处理各种边界情况,如全相同元素、交替序列等,核心在于动态维护窗口内的水果种类不超过两种。
2026-01-08 10:54:29
310
原创 算法题 股票价格跨度
本文介绍了股票价格跨度问题的解决方案。该问题要求计算每日价格相对于历史价格的连续跨度天数,其中跨度定义为当日价格大于等于之前连续天数的最大长度。通过使用单调栈数据结构,可以高效地解决这一问题。文章提供了两种实现方法:单一栈存储(价格,跨度)对,以及双栈分别存储价格和跨度。算法时间复杂度为O(1)(均摊),空间复杂度O(n)。文中包含详细示例、代码实现、复杂度分析和多种测试用例,展示了算法在不同场景下的正确性和高效性。
2026-01-08 10:39:41
397
原创 算法题 递增顺序搜索树
本文介绍了将二叉搜索树转换为递增顺序搜索树的三种方法。通过中序遍历,我们可以按递增顺序重新排列节点,使每个节点只有右子节点。递归方法使用全局变量记录前驱节点,时间复杂度O(n),空间复杂度O(h)。迭代方法利用栈实现中序遍历,同样具有线性时间复杂度。两次遍历方法先收集节点再重新链接,空间复杂度O(n)。三种方法都能有效解决问题,适用于不同场景需求。
2026-01-08 10:23:03
450
原创 算法题 单调数列
本文介绍了判断数组是否为单调数列的算法。通过一次遍历同时检测单调递增和递减条件,优化了传统两次遍历的方法。算法时间复杂度为O(n),空间复杂度为O(1),能高效处理边界情况如空数组或全等元素。测试用例验证了算法在各种场景下的正确性,包括单调递增、递减、非单调序列以及特殊边界情况。该方法简洁高效,是解决此类问题的优选方案。
2026-01-07 16:43:53
288
原创 算法题 最大频率栈
本文介绍了最大频率栈的实现方法,通过多层栈结构高效处理元素频率问题。核心思路是使用两个哈希表:freq记录元素当前频率,group按频率分组存储元素栈。push操作时更新频率并将元素推入对应频率栈;pop时从最高频率栈弹出元素,并动态调整最大频率。该算法时间复杂度为O(1),空间复杂度O(N),能正确保证频率优先和栈顶优先的弹出顺序。文末提供了详细测试用例验证算法正确性。
2026-01-07 16:33:53
632
原创 算法题 所有可能的真二叉树
本文探讨了生成所有可能的真二叉树的问题。真二叉树要求每个节点必须有0或2个子节点。文章提出两种算法:递归+记忆化和自底向上动态规划。关键点在于真二叉树的节点数必须是奇数,通过递归分解为左右子树组合。时间复杂度为O(2^n),空间复杂度O(2^n),属于指数级增长。文中给出了具体代码实现,并分析了n=3、5、7时的递归过程,展示了不同节点数对应的真二叉树结构数量。
2026-01-07 16:20:20
790
原创 算法题 根据前序和后序遍历构造二叉树
摘要 本文介绍了如何根据二叉树的前序遍历和后序遍历结果构造二叉树。由于缺少中序遍历信息,这种构造方法可能产生多个合法结果。算法核心思路是利用前序确定根节点,后序确定子树范围,通过递归分治构建二叉树。提供了两种实现方式:一种使用哈希表优化查找效率(O(n)时间),另一种采用简洁递归但效率较低。文章包含详细代码示例、算法分析以及具体构建过程的逐步说明,适用于处理节点值唯一且需要返回任意一种可能结构的二叉树问题。
2025-12-31 16:29:54
397
原创 算法题 公平的糖果交换
本文介绍了公平糖果交换问题的解法。给定爱丽丝和鲍勃的糖果数组,要求交换一盒糖果使两人糖果总量相等。核心算法通过数学推导得出:计算两人糖果总和差的一半,然后使用哈希表快速查找满足条件的交换对。时间复杂度为O(m+n),空间复杂度为O(min(m,n))。文中提供了Java实现代码和多个测试用例验证算法正确性,包括标准示例、单元素数组、大数值及负数等情况。该算法高效可靠,能准确找到唯一解。
2025-12-31 16:14:13
309
原创 算法题 鸡蛋掉落
鸡蛋掉落问题是一个经典的动态规划问题,旨在确定在最坏情况下找到临界楼层 f 所需的最小操作次数。摘要如下: 问题描述:给定 k 个鸡蛋和 n 层楼,找到临界楼层 f 的最小操作次数。鸡蛋从高于 f 的楼层掉落会碎,否则不碎。 算法思路: 基础DP:定义 dp[k][n] 为最小操作次数,通过遍历每一层计算最坏情况下的操作数,时间复杂度 O(kn²)。 优化DP:利用二分搜索优化查找最优楼层,时间复杂度 O(kn logn)。 逆向DP:重新定义状态为 dp[m][k] 表示 m 次操作最多能测试的楼层数,通
2025-12-31 16:00:40
606
原创 算法题 可能的二分法
可能的二分法摘要 该问题要求将n个人分成两组,使得互相不喜欢的人不在同一组。通过构建图的邻接表(节点代表人,边代表不喜欢关系),问题转化为二分图检测(能否用两种颜色着色且相邻节点颜色不同)。 算法方案: BFS/DFS着色法:从任意节点开始,交替着色,若发现相邻节点颜色相同则返回false。 并查集:将每个节点的不喜欢节点合并到同一集合,若冲突则返回false。 复杂度:时间复杂度O(V+E),空间复杂度O(V)。示例表明,当图中存在奇数环时无法分组(如三角形关系)。
2025-12-31 10:26:24
391
原创 算法题 两句话中的不常见单词
摘要 本文介绍了如何找出两个句子中的不常见单词。不常见单词定义为在两个句子中总共只出现一次且至少出现在一个句子中的单词。算法采用哈希表统计两个句子合并后的单词频次,筛选出频次为1的单词作为结果。提供了两种实现方式:常规哈希表方法和使用Stream的简洁实现。时间复杂度为O(m+n),空间复杂度为O(m+n),其中m和n分别是两个句子的长度。通过多个测试用例验证了算法的正确性,包括标准示例、重复单词、空结果等场景。
2025-12-31 10:08:34
292
原创 算法题 救生艇
本文提出了一种贪心算法结合双指针的方法解决救生艇问题。算法首先对人员体重排序,然后用双指针分别指向最轻和最重的人。每次尝试让两者同乘一艘船(若重量和不超过限制),否则最重者单独乘船。该策略确保最重的人优先配对,最小化船只使用量。时间复杂度为O(n log n),空间复杂度O(1)。测试用例验证了算法在各种情况下的正确性,包括极限重量和大数组场景。关键点在于贪心选择最优配对策略,确保全局最优解。
2025-12-31 09:56:59
375
原创 算法题 石子游戏
摘要: 石子游戏问题中,亚历克斯和李轮流从偶数堆石子行的两端取堆。亚历克斯先手,两人均采取最优策略。数学解法利用石子堆数为偶数的特性,证明亚历克斯必胜(时间复杂度O(1))。动态规划解法定义dp[i][j]为当前玩家在区间[i,j]的最大分数差值,通过状态转移方程计算胜负(时间复杂度O(n²))。测试验证了算法正确性,包括对称、递增、递减等数组情况。由于题目保证堆数为偶数且石子总数为奇数,亚历克斯总能获胜。
2025-12-30 16:40:48
797
原创 算法题 链表的中间结点
摘要 本文介绍了寻找链表中间结点的三种方法,重点分析了快慢指针算法。给定一个非空单链表,需要返回中间结点(如果有两个中间结点则返回第二个)。快慢指针算法通过让慢指针每次移动1步、快指针每次移动2步,当快指针到达末尾时慢指针正好位于中间位置,时间复杂度O(n),空间复杂度O(1)。其他方法包括两次遍历和数组存储,但快慢指针是最优解。测试用例验证了算法在奇偶长度链表中的正确性。
2025-12-30 16:22:07
568
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅