- 博客(22)
- 收藏
- 关注
原创 力扣133.克隆图
本文提出了一种基于深度优先搜索(DFS)和哈希表的无向连通图克隆算法。算法通过哈希表记录原节点与克隆节点的映射关系,避免重复创建节点。DFS遍历原图时,若节点已克隆则直接返回克隆节点,否则创建新节点并递归处理其邻居。该方法有效解决了无向图中循环引用和双向引用问题,确保克隆图与原图结构一致但内存独立。算法时间复杂度为O(N+E),空间复杂度为O(N),其中N为节点数,E为边数。代码实现包含节点定义、哈希表操作、递归克隆和内存管理等完整功能,并通过测试验证了正确性。
2025-11-30 17:00:56
391
原创 力扣1971.寻找图中是否存在路径
本文研究了无向图中顶点连通性判断问题,针对大规模数据(顶点数达2×10^5)提出两种高效解法。并查集方法通过路径压缩和按秩合并优化,实现接近线性的时间复杂度;BFS方法通过邻接表存储和队列遍历确保高效性。实验表明两种方法均能有效处理大规模图数据,其中并查集在空间效率上更具优势。文章详细阐述了两种算法的实现细节,包括数据结构设计、核心操作流程和复杂度分析,为大规模图连通性问题提供了实用解决方案。
2025-11-30 14:38:30
717
原创 力扣321拼接最大数
摘要:本文探讨了从两个整数数组中选取k个数字构造最大数的算法问题。通过分治思想将问题拆解为三个子问题:1)使用单调栈从单个数组中获取指定长度的最大子序列;2)合并两个子序列构建最大数;3)枚举所有可能的数字选取组合。算法采用贪心策略和单调栈结构,确保结果的数值最大且保持原始顺序。文章详细解析了算法实现、边界条件处理和时间复杂度(O(k*(m+n+k))),并提供了完整的C语言代码实现。该解决方案有效地结合了贪心算法、单调栈和双指针技术来处理复杂的数组合并问题。
2025-11-20 00:41:03
941
原创 力扣456.132模式
摘要:本文探讨了如何在整数数组中查找132模式的子序列(即满足i<j<k且nums[i]<nums[k]<nums[j]的三元组)。首先分析了暴力解法(O(n³))的不足,随后探讨了优化思路,包括预处理最小值和从后向前遍历的策略。重点介绍了使用单调栈的O(n)解法:从后向前遍历,维护一个单调递减栈来存储候选的nums[j],同时用second变量记录可能的nums[k]。当找到nums[i]<second时即可返回true。该方法通过单次遍历和栈操作,高效解决了问题。
2025-11-17 00:30:26
920
原创 力扣1475商品折扣后的最终价格
摘要:题目要求在价格数组中找到每个元素右侧第一个小于等于它的元素作为折扣,计算最终价格。这是一个典型的"下一个更小元素"问题,可通过单调栈高效解决。算法使用单调递减栈,在O(n)时间复杂度和O(n)空间复杂度内完成计算:初始化结果数组后,遍历时将栈顶元素与当前元素比较,找到符合条件的折扣并更新结果,最后返回折扣后的价格数组。关键点在于利用单调栈维护元素间的递减关系,快速定位右侧第一个较小元素。
2025-11-16 19:47:03
316
原创 力扣496下一个更大元素 |
摘要:给定两个无重复元素的数组nums1和nums2,其中nums1是nums2的子集。要求找出nums1中每个元素在nums2中对应位置右侧的第一个更大元素。采用单调栈和哈希表的高效组合方案:首先用单调栈预处理nums2,建立元素与其下一个更大元素的映射关系(时间复杂度O(m)),然后通过哈希表快速查询nums1中各元素结果(时间复杂度O(n))。整体时间复杂度优化为O(n+m),空间复杂度为O(m+n),相比暴力解法显著提升了效率。该方法体现了数据结构选择对算法性能的关键影响,具有解决类似问题的通用性。
2025-11-12 19:44:00
344
原创 力扣338比特位计数
摘要:本文提出了一种基于动态规划的算法,用于高效计算0到n每个整数的二进制表示中1的个数。通过分析二进制数的规律,发现当前数的1的个数等于去掉最高位1后的数的1个数加1。利用dp数组存储中间结果,在O(n)时间复杂度和O(n)空间复杂度内解决问题。算法使用位运算判断2的幂次,并通过状态转移方程dp[i] = dp[i-highBit]+1进行计算。该方法相比逐位统计显著提高了效率,适用于大规模数值处理。
2025-11-09 20:10:59
1025
原创 力扣337打家劫舍|||
摘要:本文探讨了二叉树结构中房屋打劫问题的动态规划解法。核心约束是父节点与子节点不能同时被打劫。算法采用后序遍历计算每个节点的两种状态:打劫该节点或不打劫该节点时的最大收益。通过递归处理子节点状态并向上传递,最终在根节点处比较两种状态得到全局最优解。该方法时间复杂度为O(n),空间复杂度最差为O(n)(当二叉树退化为链表时)。算法利用二叉树后序遍历特性,实现了高效的状态转移计算。
2025-11-09 19:48:44
996
原创 力扣213.打家劫舍||
本文解决环形房屋的打家劫舍问题。通过将环形结构分解为两个线性子问题(分别排除首尾房屋),分别计算最大收益后取最大值。采用动态规划方法,使用辅助函数robLinear处理线性情况,主函数rob处理环形情况。算法时间复杂度O(n),空间复杂度O(1)。测试结果验证了方案的正确性,能有效处理环形房屋限制下的最优偷窃策略。
2025-11-02 20:29:12
312
原创 力扣198.打家劫舍
摘要:该问题描述了一个房屋盗窃的最优策略问题,要求在不能偷相邻房屋的约束下获得最大收益。通过动态规划方法,建立状态转移方程dp[i]=max(dp[i-1], dp[i-2]+nums[i]),记录到第i个房屋时的最大收益。代码实现中使用了O(n)空间存储中间结果,时间复杂度为O(n)。测试用例验证了算法的正确性,能有效计算出不触发警报情况下的最大盗窃金额。
2025-11-02 20:20:19
229
原创 力扣354俄罗斯套娃信封问题
俄罗斯套娃信封问题要求计算最多能嵌套的信封数量,解题关键在于降维处理。首先将信封按宽度升序、同宽度时高度降序排序,转化为高度数组的最长严格递增子序列(LIS)问题。随后采用贪心+二分查找的高效解法,维护最小尾元素数组tails,通过二分定位更新策略实现O(nlogn)时间复杂度。该算法避免了同宽度信封的干扰,正确求解最大嵌套数,空间复杂度为O(n)。典型示例输入[[5,4],[6,7],[2,3]]经过处理后可得解3([2,3]→[5,4]→[6,7])。
2025-11-02 19:39:29
840
原创 探索位运算
位运算是一种高效的二进制操作方式,主要包括与、或、异或、取反、左移和右移等基本运算。其中,n&(n-1)可清除最低位的1,常用于判断2的幂或统计1的个数;n&(-n)能提取最低位的1,适用于树状数组等场景;n|(n+1)则能将最低位的0变为1并将其右侧全置1。这些运算原理均基于二进制数的特性,通过补码和位操作实现快速计算,在算法优化、内存管理等领域有广泛应用。理解这些技巧可以显著提升程序的执行效率。
2025-10-26 20:48:56
255
原创 力扣1575统计所有可行路径
这篇文章介绍了一个使用动态规划和记忆化搜索算法解决路径统计问题的方案。关键点在于统计从起点到终点所有可能的路径数,允许重复访问城市且不能燃料耗尽。作者定义dp[i][f]表示从城市i出发剩余燃料f时的路径数,通过递归遍历所有可能转移,利用记忆数组避免重复计算。算法时间复杂度为O(n²×fuel),空间复杂度为O(n×fuel),采用模运算防止数值溢出。代码实现包含初始化记忆数组的dfs函数和主调函数,清晰地展示了这个经典动态规划问题的解决方案。
2025-10-26 20:27:28
195
原创 力扣300最长递增子序列
本文介绍用动态规划解决最长递增子序列问题。定义dp[i]表示以nums[i]结尾的最长子序列长度,初始化为1。通过双重循环遍历数组,当nums[j]<nums[i]时更新dp[i]为max(dp[i],dp[j]+1)。最终取dp数组最大值即为答案。时间复杂度O(n²),空间复杂度O(n)。代码示例展示了该算法的具体实现和测试用例。
2025-10-26 18:53:12
285
原创 迭代(Iteration)
迭代是一种通过显式循环重复执行逻辑、逐步更新状态的编程方式,它与递归的核心区别在于 “是否依赖函数自身调用”。迭代的优势是内存消耗低、执行效率高,适合大多数 “重复操作且逻辑直观” 的场景;而递归更适合 “问题可分治、逻辑抽象” 的场景。在实际开发中,需根据问题特点选择更合适的方式(甚至可将递归优化为迭代,减少栈开销)
2025-10-20 22:16:43
291
原创 力扣63.不同路径||
相比基础的「不同路径」问题,本题增加了障碍物的限制,更贴近实际场景。这道题同样可以使用动态规划(Dynamic Programming)求解,核心思路是通过构建dp数组记录到达每个位置的不同路径数,同时避开障碍物。
2025-10-19 14:19:50
524
原创 力扣62.不同路径
摘要:本文介绍了动态规划方法解决机器人路径问题。通过分析机器人只能向右或向下移动的特点,将问题拆解为子问题,定义状态转移方程dp[i][j]=dp[i-1][j]+dp[i][j-1]。文中以爬楼梯为例说明动态规划的基本思想,包括最优子结构和子问题重叠特性,并给出了C语言实现代码。最后详细阐述了动态规划的解题步骤:定义状态、分析可能性、推导方程,并强调该方法适用于需要最优解且具有可分解性的问题。解题时间复杂度为O(mn),空间复杂度为O(mn)。
2025-10-17 17:11:57
989
原创 力扣42接雨水
接雨水问题是计算柱子间积水量的经典算法问题。采用单调栈法,通过维护递减栈记录可能形成积水区的柱子边界:当遇到高于栈顶的柱子时,弹出栈顶作为底部,计算当前左右边界与高度的积水量。算法需处理边界条件,时间复杂度O(n),空间复杂度O(n)。示例演示了如何逐步计算各区域的积水量并累加最终结果。
2025-10-09 15:39:04
275
原创 力扣785判断二分图
摘要:无向图与二分图是图论中的核心概念,二者具有包含关系但特性不同。无向图的边无方向且顶点连接双向,而二分图作为其特殊子集,要求顶点可划分为两个独立子集且边仅存在于子集间。关键区别在于二分图不含奇数长度环,可通过BFS/DFS染色法(时间复杂度O(V+E))高效检测。无向图适用于社交网络等双向关系建模,二分图则专精于任务分配等匹配问题。文中提供了C语言实现的二分图判定算法,包含邻接表构建、BFS遍历和冲突检测功能,并通过测试用例验证了其正确性。该实现兼顾时空效率(O(V)空间复杂度),适用于大规模图结构分析
2025-10-09 15:16:17
638
原创 力扣46、47全排列
回溯法是一种采用深度优先搜索的暴力搜索策略,通过"尝试-失败-回退"机制寻找问题的解。文中给出了C和C++实现的全排列生成算法,通过递归构建排列,使用visited数组标记已选元素,当发现无效路径时撤销选择。算法时间复杂度为O(n×n!),空间复杂度为O(n×n!)(含结果存储)或O(n)(仅算法本身)。针对重复元素的情况,先排序再通过条件判断跳过重复解。这种系统性的穷举方法能有效解决排列组合等暴力搜索问题。
2025-09-15 17:20:09
967
原创 LeetCode两数之和、三数之和的学习
本文介绍了在有序数组中求解两数之和和三数之和问题的算法实现。针对两数之和问题,提出了双指针法(O(n)时间复杂度)和二分查找法(O(nlogn)时间复杂度)两种解决方案。对于三数之和问题,重点介绍了基于双指针法的优化实现(O(n²)时间复杂度),并给出了C和C++的具体代码实现。两种问题都利用了数组的有序特性,通过调整指针位置来高效地寻找符合条件的组合,同时处理了重复解的情况。算法空间复杂度主要为O(1)(两数之和)和O(logn)(三数之和的排序开销)。
2025-09-15 03:17:25
504
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅