自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 贪心算法从 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 791

原创 贪心算法从 0 开始 —— 第 4 章:加油站补给 Gas Station(加强版)

本文介绍了解决加油站补给问题的贪心算法。首先通过暴力解法(O(n²))模拟每个起点,发现效率不足。然后提出贪心策略:1) 总油量需≥总开销才有解;2) 遍历时若油量变负则重置起点。最终实现一次遍历的O(n)解法,并通过示例分析其正确性。文章对比了两种方法,强调贪心算法的高效性和适用性,适用于环形路径的盈亏差值问题。最后预告下一章将探讨Huffman编码的最小代价构造问题。

2025-07-13 20:17:49 853

原创 贪心算法从 0 开始 —— 第 3 章:跳跃游戏 Jump Game

本文介绍了跳跃游戏问题的贪心算法解法。文章首先展示了暴力回溯法的实现(DFS),分析其时间复杂度为O(2ⁿ)的缺陷,然后提出更优的贪心算法:通过维护maxReach变量表示当前能跳到的最远位置,只需遍历数组一次(O(n)时间),若发现当前位置无法到达则失败。文章通过两个示例详细拆解了贪心算法的执行过程,并与暴力法进行对比,强调贪心算法只关注可达性而非具体路径的特点。最后总结了贪心算法的核心思路和优势,并预告下一章将讲解环形加油站问题。该解法简洁高效,适合笔试面试场景。

2025-07-13 20:17:05 831

原创 贪心算法从 0 开始 —— 第 2 章:区间调度问题(不重叠最多区间)

本文介绍了贪心算法解决区间调度问题的经典方法。针对会议室安排问题,作者指出按最早开始时间排序的错误思路,提出正确的贪心策略:优先选择结束时间最早的会议。通过JavaScript实现演示了具体解法:先按结束时间排序,再遍历选择不重叠的会议。分析该方法的时间复杂度为O(n log n),空间复杂度O(1)。文章还对比了贪心与动态规划的适用场景,列举了类似实际应用,并预告下一章将讲解跳跃游戏问题。该解法简洁高效,是理解贪心算法"局部最优+不回头"特性的典型案例。

2025-07-13 20:15:46 279

原创 贪心算法从 0 开始 —— 第 1 章:入门与零钱兑换问题

本文介绍了贪心算法的基本概念及其在硬币找零问题中的应用。贪心算法通过每一步选择当前最优解来寻求全局最优,具有简单高效的特点,但并不适用于所有问题。作者以最小货币找零为例,详细讲解了贪心策略的实现思路和JavaScript代码,同时指出贪心算法在某些情况下并非最优解(如面额[10,6,1]时的12元找零)。文章还预告了后续章节将讨论的区间调度等更复杂问题,为算法初学者提供了循序渐进的学习路径。

2025-07-13 20:14:43 348

原创 第八章:完全背包问题 —— 可重复选择的背包策略

完全背包问题允许物品无限次选取,与0-1背包形成对比。其核心在于状态转移方程的变化:当选择某物品时,允许继续使用该物品(dp[i][j] = dp[i][j-weight[i-1]] + value[i-1])。空间优化时需正序遍历容量,确保物品可重复使用。关键区别在于0-1背包倒序容量(防止重复),完全背包正序容量(允许重复)。该问题为多重背包等更复杂场景奠定了基础,理解状态转移方向是解题关键。

2025-07-12 19:25:05 349

原创 第七章:0-1 背包问题——选与不选的抉择

0-1背包问题是一个经典的动态规划问题,要求在容量为W的背包中装入n件物品(每件只能选一次),使总价值最大。解法核心是构建二维状态矩阵dp[i][j],表示前i件物品在容量j时的最大价值。状态转移方程比较选与不选当前物品的价值,取最大值。通过空间优化可压缩为一维数组,采用倒序遍历避免重复计算。该问题体现了动态规划的子问题重叠特性,是学习完全背包等变种问题的基础。示例代码展示了二维和优化后的解法。

2025-07-12 19:24:07 278

原创 第六章:编辑距离问题(Edit Distance)——最少操作将字符串转换为目标

本文介绍了编辑距离问题,即计算将一个字符串转换为另一个字符串所需的最少操作次数(插入、删除或替换字符)。通过动态规划方法,定义二维状态数组dp[i][j]表示转换前i个字符到前j个字符的最小操作数,并给出了状态转移方程和边界条件。示例展示了"horse"到"ros"的转换过程,最终结果为3次操作。该问题是典型的二维动态规划应用,为后续学习字符串相似度计算和最长公共子序列问题奠定了基础。

2025-07-11 09:12:10 420

原创 第五章:最长上升子序列(LIS)——寻找递增趋势的极限

本文介绍了最长上升子序列(LIS)问题的两种解法。基础解法采用动态规划,定义dp[i]为以nums[i]结尾的最长上升子序列长度,通过双重循环比较元素更新状态,时间复杂度O(n²)。优化解法结合贪心和二分查找,维护tails数组记录各长度最小的末尾元素,利用二分查找快速更新,将时间复杂度降至O(n log n)。两种方法的空间复杂度均为O(n)。文章通过具体示例演示了算法执行过程,并指出LIS问题是序列型动态规划的典型代表,为后续学习更复杂的动态规划问题奠定基础。

2025-07-11 09:11:13 371

原创 第四章:零钱兑换问题——最少硬币组合

本文介绍了零钱兑换问题的动态规划解法。该问题要求用给定硬币面额组合凑出目标金额的最少硬币数量。定义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 387

原创 第三章:打家劫舍问题——隔间选择的最优策略

令dp[i]表示前i+1间房屋(下标 0~i)中,在不触动警报的前提下,可以偷窃到的最大金额。

2025-07-10 17:33:42 224

原创 第二章:爬楼梯问题——斐波那契的现实应用

本文介绍了经典的“爬楼梯问题”及其动态规划解法。题目要求计算爬到n阶楼梯的方法数,每次可走1或2阶。通过定义状态dp[i]表示到达第i阶的方法数,推导出状态转移方程dp[i] = dp[i-1] + dp[i-2],与斐波那契数列相同。文章给出了标准DP实现和空间优化版本,并以n=4为例演示了计算过程。该问题很好地诠释了动态规划的核心思想:分解子问题并避免重复计算。最后预告下一章将探讨更复杂的“打家劫舍问题”。

2025-07-10 17:31:58 400

原创 第一章:动态规划算法入门:从斐波那契数列开始

本文从斐波那契数列入手,介绍动态规划的基本原理。首先展示递归解法虽然直观但效率低下(时间复杂度O(2^n)),然后逐步引入动态规划解决方案:先用数组存储中间结果(O(n)时间/空间复杂度),再进行空间优化为滚动变量(O(1)空间)。通过对比递归与动态规划的性能差异,阐明了动态规划在解决具有重叠子问题时的优势,并总结了动态规划的基本解题步骤,为后续学习更复杂的动态规划问题奠定基础。

2025-07-10 17:26:47 1126

原创 从零开始学习滑动窗口算法(最终):最小覆盖子串(窗口内频率匹配)

本文介绍了滑动窗口算法解决「最小覆盖子串」问题的思路与实现。该题目要求找到字符串s中包含字符串t所有字符的最小子串,需考虑字符频率匹配。核心解法使用双指针维护窗口,并通过哈希表记录字符需求频次和窗口频次。当窗口满足所有字符需求时收缩左指针优化解,最终返回最小窗口。代码实现以JavaScript为例,详细解析了难点与复杂度(O(n)时间,O(Σ)空间)。该题综合了滑动窗口、哈希计数和合法性判断,是算法学习的经典案例。

2025-07-10 17:04:02 269

原创 从零开始学习滑动窗口算法(三):和为 K 的子数组个数(前缀和 + 哈希)

本文介绍了如何利用前缀和与哈希表解决「和为 K 的子数组」问题。当数组中存在负数时,传统滑动窗口算法失效,需要改用前缀和技巧。通过维护一个哈希表记录前缀和出现次数,可以在O(n)时间内统计所有满足条件的子数组。文章详细解释了算法原理,给出了JavaScript实现代码,并通过示例演示了计算过程,最后总结了该方法的适用场景和复杂度分析。

2025-07-10 17:01:57 403

原创 从零开始学习滑动窗口算法(二):和为目标值的连续子数组(定长窗口)

本文介绍了使用滑动窗口算法解决"和大于等于目标值的最短子数组长度"问题。题目要求在一个正整数数组中找出满足子数组和≥target的最短连续子数组长度。解题思路采用双指针滑动窗口技术:初始化窗口边界,不断扩展右边界累加元素,当窗口和满足条件时收缩左边界以寻找更优解。文章提供了JavaScript代码实现,并分析了O(n)的时间复杂度。最后指出该算法适用于最短子数组问题,且适用于元素均为正数的情况,为后续处理包含负数的情况埋下伏笔。

2025-07-10 17:01:09 289

原创 从零开始学习滑动窗口算法(一):寻找字符串中不含重复字符的最长子串

文章摘要:本文介绍了使用滑动窗口算法解决LeetCode第3题"寻找无重复字符的最长子串"的方法。滑动窗口通过维护左右指针动态调整窗口范围,用集合存储当前窗口字符,遇到重复时移动左指针缩小窗口。时间复杂度O(n),空间复杂度O(k)。该算法是处理子串问题的利器,关键在于动态维护窗口和正确判断窗口合法性。文中提供了JavaScript实现代码和复杂度分析,并预告后续将讨论更复杂的滑动窗口应用场景。

2025-07-10 17:00:17 133

原创 25-深入理解 JavaScript 异步生成器的实现

生成器是 JavaScript 中的一种函数类型,调用生成器函数时返回一个迭代器对象,可以通过next方法一步步执行,并根据需要暂停和恢复执行。异步生成器类似,但它可以在暂停的间隙等待异步操作完成,再继续执行。h0 });本文解析了一个 JavaScript 异步生成器控制器的实现。通过这种控制器,您可以在不支持asyncawait的环境中,管理基于生成器的异步操作。这一实现方式不仅提高了代码兼容性,还帮助我们更深入地理解了异步生成器的内部工作机制。

2024-11-16 15:52:12 575 1

原创 24-原生 JavaScript 操作 DOM:从创建元素到事件处理

DOM(Document Object Model,文档对象模型)是浏览器对 HTML 或 XML 文档的编程接口,它允许开发者通过编程来操作文档的结构、样式和内容。在 JavaScript 中,DOM 提供了许多方法来动态地添加、修改和删除页面中的元素和内容。通过本文的学习,我们掌握了使用原生 JavaScript 操作 DOM 的基础知识,包括创建和插入元素、修改属性和内容、事件处理、动态生成列表等。掌握这些基础技能对理解前端开发非常重要,即使在使用框架时,它们也能帮助你编写更高效的代码。

2024-11-16 15:50:28 1114

原创 23-JSX 与模板:区别、优缺点

JSX 是 JavaScript XML 的缩写,是 React 框架中的一种语法扩展。它允许开发者在 JavaScript 代码中直接编写类似 HTML 的语法,从而更直观地构建用户界面。模板 (Template) 通常是指在前端框架中使用的一种定义 UI 结构的方式。它们通常与特定的框架绑定,例如 Vue.js 中的模板语法,Angular 中的模板语法等。

2024-11-16 15:48:03 931

原创 22-深入理解 async 和 defer:优化你的 JavaScript 加载策略

在现代网页开发中,优化页面加载速度和性能是至关重要的。JavaScript 文件的加载和执行可以显著影响页面的加载时间和用户体验。async和defer,它们可以帮助我们更好地控制脚本的加载和执行行为。那么,async和defer到底是什么,它们之间有什么区别,又该如何选择呢?让我们一起来深入探讨。

2024-11-16 15:44:56 838

原创 21-JavaScript 解构赋值简介

JavaScript 的解构赋值特性极大地提高了代码的可读性和可维护性。通过解构赋值,我们可以轻松地从数组和对象中提取数据,并在函数参数中使用更简洁的方式传递和处理数据。无论是简单的数据提取,还是处理复杂的嵌套结构,解构赋值都提供了一种直观且高效的解决方案。希望通过本文的介绍,您能更好地理解和应用 JavaScript 的解构赋值特性。

2024-11-16 15:42:29 420

原创 20-使用 navigator.sendBeacon 进行高效数据传输

是一种高效且可靠的数据传输方法,特别适用于需要在不影响用户体验的情况下发送少量数据的场景。通过合理利用sendBeacon,我们可以实现用户行为分析、性能监控和错误日志记录等功能,从而提升网站的性能和用户体验。希望本文能够帮助你更好地理解并使用。

2024-11-16 15:38:24 953

原创 19-简单理解JavaScript中的Promise:手写Promise实现

Promise是JavaScript中的一种对象,用于表示一个异步操作的最终完成(或失败)及其结果值。Pending(待定):初始状态,既没有被兑现,也没有被拒绝。Fulfilled(已兑现):操作成功完成,并返回一个值。Rejected(已拒绝):操作失败,并返回一个原因。

2024-11-16 15:35:30 501

原创 18-深入理解JavaScript中的Promise

Promise是JavaScript中的一种对象,用于表示一个异步操作的最终完成(或失败)及其结果值。Pending(待定):初始状态,既没有被兑现,也没有被拒绝。Fulfilled(已兑现):操作成功完成,并返回一个值。Rejected(已拒绝):操作失败,并返回一个原因。Promise极大地改善了JavaScript异步编程的体验,使得代码更加可读和易于维护。通过掌握Promise的创建、链式调用、组合方法(如和)以及与的结合使用,可以编写出更高效、更优雅的异步代码。

2024-11-16 15:33:08 345

原创 17-理解JavaScript中的事件捕获和事件冒泡

笔记+分享在现代Web开发中,事件处理是一个至关重要的部分。JavaScript中的事件模型包括两个主要的阶段:事件捕获和事件冒泡。理解这两个概念有助于我们更好地控制事件的行为,进而编写更高效的代码。本文将详细介绍事件捕获和事件冒泡的概念、区别及其在实际开发中的应用。

2024-11-16 15:30:17 822

原创 16-简单理解offsetHeight与clientHeight的区别

是一个只读属性,它表示元素的总高度,包括元素的边框(border)、内边距(padding)和水平滚动条的高度(如果存在)。具体而言,等于元素的内容高度(content height) 加上内边距、边框和水平滚动条的高度。也是一个只读属性,它表示元素的内部高度,包括内边距(padding),但不包括边框(border)和水平滚动条的高度(如果存在)。具体而言,等于元素的内容高度(content height) 加上内边距的高度。

2024-11-16 15:25:49 866

原创 15-JavaScript 中的 `call`、`apply` 和 `bind`

调用时间call和apply:立即调用函数。bind:返回一个新的函数,可以在以后调用。参数传递call:接受参数列表。apply:接受参数数组。bind:接受参数列表,并返回一个新的函数,可以在调用时再传入额外参数。适用场景call:在知道参数数量时使用。apply:在参数数量不确定时使用,如从数组中提取参数。bind:在需要返回一个带有特定this值的新函数时使用。

2024-06-03 22:05:20 528

原创 14-JavaScript中的点操作符与方括号操作符

语法要求:点操作符只能用于有效的标识符属性名,而方括号操作符则没有此限制,可以处理任何字符串属性名。灵活性:方括号操作符更灵活,允许使用动态属性名和包含特殊字符的属性名。代码简洁性:点操作符语法更简洁,代码可读性更高,适用于静态属性名。

2024-06-03 22:00:47 406

原创 13-为什么在JavaScript中0.1 + 0.2不等于0.3?

理解这一点,并采用适当的方法来处理浮点数计算,可以帮助我们避免相关的精度问题。首先,我们需要了解计算机是如何表示小数的。而在二进制中,并不是所有的十进制小数都能精确地表示。将这些十进制小数转换为二进制浮点数时,它们只能近似表示。但是,在二进制系统中,0.1表示为一个无限循环的小数,类似于在十进制中1/3表示为0.3333…对于需要高精度计算的场景,可以使用BigDecimal库进行处理,这些库能够精确处理十进制数。这并不是精确的0.3,而是一个非常接近0.3的数值,但在计算机的精度限制下,它们并不相等。

2024-06-03 21:59:01 849

原创 12-从URL到页面:探寻Web页面渲染的全过程

从输入URL到页面完全渲染,背后涉及的步骤非常多,包括DNS解析、TCP连接的建立与终止、HTTP请求与响应处理、DOM和CSSOM树的构建、JavaScript的执行以及页面的布局和绘制。服务器可能需要查询数据库、执行后台脚本或访问其他服务,然后将响应数据(如HTML、CSS、JavaScript、图像等)发送回浏览器。在我们浏览网页时,从输入URL到最终页面呈现在浏览器上,这背后发生了一系列复杂的步骤。得到IP地址后,浏览器与服务器建立TCP连接,确保数据可以可靠传输。

2024-06-03 21:56:33 751

原创 11-深入理解 requestAnimationFrame:高效动画渲染的秘密

是一个告知浏览器你希望执行动画,并在浏览器下一次重绘之前调用指定函数的方法。相比于传统的setTimeout或实现动画的方法,能够更高效地进行动画渲染,避免丢帧和页面卡顿。是现代浏览器提供的一种高效处理动画的API。相比于传统的setTimeout或,它在性能、资源利用和代码简洁性方面都有显著优势。通过,我们可以轻松实现高性能、流畅的动画效果,从而提升用户体验。

2024-06-03 21:03:44 1869

原创 10-探索 Intersection Observer API:高效管理元素可见性

Intersection Observer API 是一种异步观察目标元素与祖先元素(或顶级文档的视口)交叉状态变化的方法。它提供了一种便捷的方式来了解元素何时进入或离开视口,从而可以在这些时机执行相应的操作。Intersection Observer API 提供了一种高效、简洁的方式来检测元素的可见性变化。通过这一API,我们可以轻松实现懒加载、无限滚动、广告曝光统计等功能,从而提升页面性能和用户体验。希望本文能帮助你更好地理解和应用Intersection Observer API。

2024-06-03 21:01:15 1028 1

原创 09-使用JavaScript处理长列表数据:惰性渲染、虚拟滚动与分批渲染

通过惰性渲染、虚拟滚动以及分批渲染,开发者可以显著优化长列表数据的处理,提升页面性能和用户体验。惰性渲染减少了不必要的数据加载,虚拟滚动仅保留视口内的数据,而分批渲染则避免了一次性渲染大量数据所导致的卡顿。希望本文能帮助你更好地理解和应用这些技术。

2024-06-03 20:59:07 988 1

原创 08-使用HappyPack提升Webpack构建速度

HappyPack 是一个让 Webpack 的构建变得更快的插件。它的核心思想是通过并行化操作,将文件的转换工作分配到多个子进程中执行,从而加快整体的构建速度。

2024-06-01 14:21:46 735

原创 07-使用 JavaScript Promise 并行处理多个请求

通过这种方式,使用时,可以确保所有Promise都能执行,无论其中某些Promise是否失败。这在处理多个并行请求时非常有用,可以确保即使某些请求失败,也能获取其他请求的结果,从而提高代码的健壮性和可靠性。希望本文的介绍和示例代码能够帮助你更好地理解和使用JavaScript中的Promise来管理并行请求。通过这种方式,开发者可以更灵活地处理并行请求,无论是使用还是,都能够确保在复杂的异步操作中更加健壮地管理请求结果。

2024-06-01 14:20:27 2608

原创 06-简单理解JavaScript事件循环:宏任务与微任务

JavaScript中的事件循环机制是理解异步编程的关键。通过了解宏任务和微任务的概念,我们可以更好地掌握JavaScript中异步代码的执行顺序。记住,宏任务和微任务的区别在于它们的执行时机和优先级,这对于编写高效、可靠的JavaScript代码至关重要。

2024-05-30 21:59:30 680 1

原创 05-JavaScript 中的 `tap` 和 `click` 事件

理解tap和click事件的区别,以及它们在不同设备和应用场景中的表现,对于开发高效、响应迅速的跨平台应用至关重要。click事件适用于桌面设备,而tap事件在移动设备上提供更好的用户体验。通过掌握事件模型、调试和优化技巧,可以显著提升用户的交互体验。

2024-05-30 21:42:04 1518

原创 04-了解和预防 JavaScript 内存泄漏

内存泄漏是 JavaScript 开发中一个常见的问题,但通过了解和预防这些常见的内存泄漏方式,可以显著提高应用的性能和稳定性。始终保持代码的整洁,及时清理不再需要的引用,并利用开发工具进行内存检测,是防止内存泄漏的有效策略。

2024-05-30 21:07:12 673 1

原创 03-JavaScript 中的相等判断与隐式类型转换

理解 JavaScript 中的相等性判断及其背后的隐式类型转换规则对于编写健壮且易于维护的代码至关重要。严格相等(===)运算符可以避免许多潜在的问题,而宽松相等(==)运算符在某些情况下虽然提供了便利,但也可能引发难以发现的错误。通过掌握这些规则,开发者可以更好地控制代码行为,提高代码质量和可靠性。

2024-05-30 20:46:41 389

空空如也

空空如也

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

TA关注的人

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