
算法
文章平均质量分 68
js算法
就是滴九点半
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
贪心算法从 0 开始 —— 第 5 章:哈夫曼编码 Huffman Coding
哈夫曼编码是一种基于贪心算法的数据压缩技术,通过构建最优二叉树实现最短平均编码长度。其核心思想是优先合并频率最低的两个节点,形成非前缀码。算法使用最小堆高效选择最小节点,合并过程确保高频字符获得短编码,低频字符获得长编码。JavaScript实现包含构建哈夫曼树、生成编码和计算加权路径长度三部分,通过递归遍历生成每个字符对应的二进制编码。示例中字符A-E的频率为[5,9,12,13,16]时,得到最优编码方案:A:100,B:101,C:00,D:01,E:11,总编码长度55。该算法在数据压缩领域具有广泛原创 2025-07-13 20:18:43 · 807 阅读 · 0 评论 -
贪心算法从 0 开始 —— 第 4 章:加油站补给 Gas Station(加强版)
本文介绍了解决加油站补给问题的贪心算法。首先通过暴力解法(O(n²))模拟每个起点,发现效率不足。然后提出贪心策略:1) 总油量需≥总开销才有解;2) 遍历时若油量变负则重置起点。最终实现一次遍历的O(n)解法,并通过示例分析其正确性。文章对比了两种方法,强调贪心算法的高效性和适用性,适用于环形路径的盈亏差值问题。最后预告下一章将探讨Huffman编码的最小代价构造问题。原创 2025-07-13 20:17:49 · 870 阅读 · 0 评论 -
贪心算法从 0 开始 —— 第 3 章:跳跃游戏 Jump Game
本文介绍了跳跃游戏问题的贪心算法解法。文章首先展示了暴力回溯法的实现(DFS),分析其时间复杂度为O(2ⁿ)的缺陷,然后提出更优的贪心算法:通过维护maxReach变量表示当前能跳到的最远位置,只需遍历数组一次(O(n)时间),若发现当前位置无法到达则失败。文章通过两个示例详细拆解了贪心算法的执行过程,并与暴力法进行对比,强调贪心算法只关注可达性而非具体路径的特点。最后总结了贪心算法的核心思路和优势,并预告下一章将讲解环形加油站问题。该解法简洁高效,适合笔试面试场景。原创 2025-07-13 20:17:05 · 864 阅读 · 0 评论 -
贪心算法从 0 开始 —— 第 2 章:区间调度问题(不重叠最多区间)
本文介绍了贪心算法解决区间调度问题的经典方法。针对会议室安排问题,作者指出按最早开始时间排序的错误思路,提出正确的贪心策略:优先选择结束时间最早的会议。通过JavaScript实现演示了具体解法:先按结束时间排序,再遍历选择不重叠的会议。分析该方法的时间复杂度为O(n log n),空间复杂度O(1)。文章还对比了贪心与动态规划的适用场景,列举了类似实际应用,并预告下一章将讲解跳跃游戏问题。该解法简洁高效,是理解贪心算法"局部最优+不回头"特性的典型案例。原创 2025-07-13 20:15:46 · 294 阅读 · 0 评论 -
贪心算法从 0 开始 —— 第 1 章:入门与零钱兑换问题
本文介绍了贪心算法的基本概念及其在硬币找零问题中的应用。贪心算法通过每一步选择当前最优解来寻求全局最优,具有简单高效的特点,但并不适用于所有问题。作者以最小货币找零为例,详细讲解了贪心策略的实现思路和JavaScript代码,同时指出贪心算法在某些情况下并非最优解(如面额[10,6,1]时的12元找零)。文章还预告了后续章节将讨论的区间调度等更复杂问题,为算法初学者提供了循序渐进的学习路径。原创 2025-07-13 20:14:43 · 365 阅读 · 0 评论 -
第八章:完全背包问题 —— 可重复选择的背包策略
完全背包问题允许物品无限次选取,与0-1背包形成对比。其核心在于状态转移方程的变化:当选择某物品时,允许继续使用该物品(dp[i][j] = dp[i][j-weight[i-1]] + value[i-1])。空间优化时需正序遍历容量,确保物品可重复使用。关键区别在于0-1背包倒序容量(防止重复),完全背包正序容量(允许重复)。该问题为多重背包等更复杂场景奠定了基础,理解状态转移方向是解题关键。原创 2025-07-12 19:25:05 · 357 阅读 · 0 评论 -
第七章:0-1 背包问题——选与不选的抉择
0-1背包问题是一个经典的动态规划问题,要求在容量为W的背包中装入n件物品(每件只能选一次),使总价值最大。解法核心是构建二维状态矩阵dp[i][j],表示前i件物品在容量j时的最大价值。状态转移方程比较选与不选当前物品的价值,取最大值。通过空间优化可压缩为一维数组,采用倒序遍历避免重复计算。该问题体现了动态规划的子问题重叠特性,是学习完全背包等变种问题的基础。示例代码展示了二维和优化后的解法。原创 2025-07-12 19:24:07 · 291 阅读 · 0 评论 -
第六章:编辑距离问题(Edit Distance)——最少操作将字符串转换为目标
本文介绍了编辑距离问题,即计算将一个字符串转换为另一个字符串所需的最少操作次数(插入、删除或替换字符)。通过动态规划方法,定义二维状态数组dp[i][j]表示转换前i个字符到前j个字符的最小操作数,并给出了状态转移方程和边界条件。示例展示了"horse"到"ros"的转换过程,最终结果为3次操作。该问题是典型的二维动态规划应用,为后续学习字符串相似度计算和最长公共子序列问题奠定了基础。原创 2025-07-11 09:12:10 · 438 阅读 · 0 评论 -
第五章:最长上升子序列(LIS)——寻找递增趋势的极限
本文介绍了最长上升子序列(LIS)问题的两种解法。基础解法采用动态规划,定义dp[i]为以nums[i]结尾的最长上升子序列长度,通过双重循环比较元素更新状态,时间复杂度O(n²)。优化解法结合贪心和二分查找,维护tails数组记录各长度最小的末尾元素,利用二分查找快速更新,将时间复杂度降至O(n log n)。两种方法的空间复杂度均为O(n)。文章通过具体示例演示了算法执行过程,并指出LIS问题是序列型动态规划的典型代表,为后续学习更复杂的动态规划问题奠定基础。原创 2025-07-11 09:11:13 · 383 阅读 · 0 评论 -
第四章:零钱兑换问题——最少硬币组合
本文介绍了零钱兑换问题的动态规划解法。该问题要求用给定硬币面额组合凑出目标金额的最少硬币数量。定义dp[i]表示金额i所需最少硬币数,状态转移方程为dp[i] = min(dp[i], dp[i-coin]+1)。初始化时dp[0]=0,其他设为极大值。通过两层循环实现,时间复杂度O(amount×n)。示例展示了从1到11金额的逐步计算过程,最终得出11=5+5+1的最优解3。该问题属于完全背包模型,下一章将探讨最长上升子序列问题。原创 2025-07-11 09:10:19 · 409 阅读 · 0 评论 -
第三章:打家劫舍问题——隔间选择的最优策略
令dp[i]表示前i+1间房屋(下标 0~i)中,在不触动警报的前提下,可以偷窃到的最大金额。原创 2025-07-10 17:33:42 · 234 阅读 · 0 评论 -
第二章:爬楼梯问题——斐波那契的现实应用
本文介绍了经典的“爬楼梯问题”及其动态规划解法。题目要求计算爬到n阶楼梯的方法数,每次可走1或2阶。通过定义状态dp[i]表示到达第i阶的方法数,推导出状态转移方程dp[i] = dp[i-1] + dp[i-2],与斐波那契数列相同。文章给出了标准DP实现和空间优化版本,并以n=4为例演示了计算过程。该问题很好地诠释了动态规划的核心思想:分解子问题并避免重复计算。最后预告下一章将探讨更复杂的“打家劫舍问题”。原创 2025-07-10 17:31:58 · 415 阅读 · 0 评论 -
第一章:动态规划算法入门:从斐波那契数列开始
本文从斐波那契数列入手,介绍动态规划的基本原理。首先展示递归解法虽然直观但效率低下(时间复杂度O(2^n)),然后逐步引入动态规划解决方案:先用数组存储中间结果(O(n)时间/空间复杂度),再进行空间优化为滚动变量(O(1)空间)。通过对比递归与动态规划的性能差异,阐明了动态规划在解决具有重叠子问题时的优势,并总结了动态规划的基本解题步骤,为后续学习更复杂的动态规划问题奠定基础。原创 2025-07-10 17:26:47 · 1138 阅读 · 0 评论 -
从零开始学习滑动窗口算法(最终):最小覆盖子串(窗口内频率匹配)
本文介绍了滑动窗口算法解决「最小覆盖子串」问题的思路与实现。该题目要求找到字符串s中包含字符串t所有字符的最小子串,需考虑字符频率匹配。核心解法使用双指针维护窗口,并通过哈希表记录字符需求频次和窗口频次。当窗口满足所有字符需求时收缩左指针优化解,最终返回最小窗口。代码实现以JavaScript为例,详细解析了难点与复杂度(O(n)时间,O(Σ)空间)。该题综合了滑动窗口、哈希计数和合法性判断,是算法学习的经典案例。原创 2025-07-10 17:04:02 · 279 阅读 · 0 评论 -
从零开始学习滑动窗口算法(三):和为 K 的子数组个数(前缀和 + 哈希)
本文介绍了如何利用前缀和与哈希表解决「和为 K 的子数组」问题。当数组中存在负数时,传统滑动窗口算法失效,需要改用前缀和技巧。通过维护一个哈希表记录前缀和出现次数,可以在O(n)时间内统计所有满足条件的子数组。文章详细解释了算法原理,给出了JavaScript实现代码,并通过示例演示了计算过程,最后总结了该方法的适用场景和复杂度分析。原创 2025-07-10 17:01:57 · 423 阅读 · 0 评论 -
从零开始学习滑动窗口算法(二):和为目标值的连续子数组(定长窗口)
本文介绍了使用滑动窗口算法解决"和大于等于目标值的最短子数组长度"问题。题目要求在一个正整数数组中找出满足子数组和≥target的最短连续子数组长度。解题思路采用双指针滑动窗口技术:初始化窗口边界,不断扩展右边界累加元素,当窗口和满足条件时收缩左边界以寻找更优解。文章提供了JavaScript代码实现,并分析了O(n)的时间复杂度。最后指出该算法适用于最短子数组问题,且适用于元素均为正数的情况,为后续处理包含负数的情况埋下伏笔。原创 2025-07-10 17:01:09 · 299 阅读 · 0 评论 -
从零开始学习滑动窗口算法(一):寻找字符串中不含重复字符的最长子串
文章摘要:本文介绍了使用滑动窗口算法解决LeetCode第3题"寻找无重复字符的最长子串"的方法。滑动窗口通过维护左右指针动态调整窗口范围,用集合存储当前窗口字符,遇到重复时移动左指针缩小窗口。时间复杂度O(n),空间复杂度O(k)。该算法是处理子串问题的利器,关键在于动态维护窗口和正确判断窗口合法性。文中提供了JavaScript实现代码和复杂度分析,并预告后续将讨论更复杂的滑动窗口应用场景。原创 2025-07-10 17:00:17 · 142 阅读 · 0 评论